【问题标题】:Linker error when building from makefile从 makefile 构建时的链接器错误
【发布时间】:2018-01-20 05:11:07
【问题描述】:

我正在尝试构建一个由分布在各个子目录中的源组成的项目,例如

Project root
├───build
└───src
    │   main.cpp
    │
    ├───ui
    │       more files
    │
    └───core
            more files

以下是我正在使用的 makefile 的相关部分:

EXT       := cpp

SRC_DIR   := src/ui src src/core
SOURCES   := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.$(EXT)))
OBJECTS   := $(SOURCES:.$(EXT)=.o)

BIN       := program

$(BIN): $(OBJECTS)
    $(LD) $(LDFLAGS) -mwindows $^ -o $@ $(LDLIBS)

$(OBJECTS): $(SOURCES)
    $(CC) $(CFLAGS) -c $< -o $@

这将导致以下错误消息:undefined reference to WinMain 可能是因为它无法找到包含 main 函数的 main.o 文件。

将所有目标文件移动到build 文件夹是否可以解决此问题?最好的方法是什么?

【问题讨论】:

  • 如果您删除 $(OBJECTS) 目标,它应该可以工作。默认目标将使用$(CXX) $(CXXFLAGS) -c -o $@ $&lt;
  • @ssbssa 工作正常。如果您还想移动目标文件,但是您需要一个明确的规则,对吗?
  • 我想你的意思是这样的:objdir/%.o: %.cpp ; $(CXX) $(CXXFLAGS) -c $&lt; -o $@

标签: makefile mingw gnu-make mingw-w64


【解决方案1】:

第一个问题在这里:

$(OBJECTS): $(SOURCES)
    $(CC) $(CFLAGS) -c $< -o $@

您已使 每个 对象的 所有 来源成为先决条件。 $&lt; 选择第一个来源。因此,当 Make 尝试构建任何目标文件(包括main.o)时,它会编译列表中的第一个源文件(src/ui/someFile.cpp)。然后它尝试链接几个相同的目标文件(具有不同的名称),并发现很多东西丢失了。

查看vpath,并查看它在此站点上有关在不同目录中使用源文件的其他问题中的用途。是的,将所有目标文件放在一个目录中(例如objects/)是个好主意。

更深层次的问题是你没有从小处着手。您应该尝试构建单个目标文件,发现命令错误,然后攻击 that 问题。

【讨论】:

  • 我之前有一个可以工作的 makefile,但后来我需要在不同的目录中组织源代码,这就是事情发生的时候。不过你是对的,我可能咬得比我能咀嚼的更多。
猜你喜欢
  • 2013-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多