微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Makefile 中的自动依赖生成:未定义对“main”的引用混合 conda 通道

如何解决Makefile 中的自动依赖生成:未定义对“main”的引用混合 conda 通道

我想向我的 Makefile 添加依赖项,以便每次修改标头时都会重新编译对应的翻译单元。目前只考虑对源文件的更改。我非常密切地关注this example

您可以在下面找到输出 undefined reference to `main' 的 MWE。一旦从编译步骤中删除变量 DEPFILES代码就会成功编译。

Makefile

CC = g++
EXEC = v1_beam.exe
RM = rm -f

BASEDIR := $(shell pwd)
SRCDIR  := src
INCDIR  := include
DEPDIR  := .deps

DEPFLAGS = -M -MT $@ -MMD -MP -MF $(DEPDIR)/$*.d
DEBUG_LEVEL := -g -fdiagnostics-color=always
EXTRA_CCFLAGS := -Wall -std=c++17 -O -pedantic -pedantic-errors
CXXFLAGS        = $(DEBUG_LEVEL) $(EXTRA_CCFLAGS)
CCFLAGS         = $(CXXFLAGS)

SRCS := $(wildcard *.cc) \
    $(wildcard $(SRCDIR)/*.cc)

OBJS := $(patsubst %.cc,%.o,$(SRCS))

DEPFILES := $(patsubst %.cc,$(DEPDIR)/%.d,$(notdir $(SRCS)))

.PHONY: all clean
.DEFAULT_GOAL = all

all: $(DEPDIR) $(EXEC)

$(EXEC): $(OBJS)
    @echo 3
    @echo Dependencies: $(wildcard $(DEPFILES))
    $(CC) $(CCFLAGS) $^ -o $@
    @echo Executable $(EXEC) created.

%.o: %.cc
%.o: %.cc Makefile
    @echo 1 
    $(CC) $(DEPFLAGS) $(CCFLAGS) -c $< -I$(BASEDIR) -o $@

$(SRCDIR)/%.o: $(SRCDIR)/%.cc $(DEPDIR)/%.d | $(DEPDIR)
    @echo 2
    $(CC) $(DEPFLAGS) $(CCFLAGS) -c $< -I$(BASEDIR) -o $@

$(DEPDIR):
    mkdir -p $@

$(DEPFILES):

clean:
    $(RM) $(OBJS) $(EXEC)

include $(wildcard $(DEPFILES))

main.cc

#include <iostream>
#include "include/dummy.h"

int main() {
  MyClass obj;
  obj.print();
  return 0;
}

include/dummy.h

#ifndef DUMMY
#define DUMMY

#include <iostream>

class MyClass {
  MyClass() { std::cout << "constructor" << std::endl; }
  void print();
};

#endif 

src/dummy.cc

#include "include/dummy.h"

void MyClass::print()  {
  std::cout << "print" << std::endl;
}

编辑:

问题似乎不在于 Makefile(尽管应该使用 -include 来避免在干净编译中的潜在问题,其中依赖项仍然不存在),而在于 {{1 }} 我使用的环境。来自 condadefault 频道的多个软件包被混合在一起。要查找其中一些软件包并验证它们来自我运行的不同 conda-forge 频道:

conda

解决问题:

conda list | grep gcc
conda list | grep compiler

从而确保使用的所有软件包都来自 conda upgrade -c conda-forge --all 频道。

解决方法

我这样做:

ifneq (,$(wildcard ${DEPDIR}/*}
include ${DEPDIR}/*
endif

并编译:

DEPFLAGS = -MT $@ -MMD -MP -MF ${DEPDIR}/$*.Td

我认为你的方法会有问题。我不知道干净编译会发生什么,但您的 DEPFILES 还不存在。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。