2017-08-11 30 views
0

我正在尝试构建一个项目,其中包含以各种子目录分发的源代码,例如从生成文件构建链接器时出错

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

下面是生成文件的相关部分,我使用:

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 [email protected] $(LDLIBS) 

$(OBJECTS): $(SOURCES) 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

这将导致以下错误消息:undefined reference to WinMain大概是因为它找不到该main.o文件,它包含的主要功能。

将所有目标文件移动到build文件夹解决此问题,什么是最好的方法来做到这一点?

+1

它应该工作,如果您删除$(OBJECTS)目标。默认目标将使用'$(CXX)$(CXXFLAGS)-c -o $ @ $ <'。 – ssbssa

+0

@ssbssa工作正常。如果你还想移动目标文件,但是你需要明确的规则吗? –

+1

我想你的意思是这个:'objdir /%。o:%.cpp; $(CXX)$(CXXFLAGS)-c $ <-o $ @' – ssbssa

回答

0

第一个问题是在这里:

$(OBJECTS): $(SOURCES) 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

你已经做了每个对象的所有来源的先决条件。 $<挑选第一个来源。所以当Make尝试构建任何目标文件(包括main.o)时,它会编译列表中的第一个源文件(src/ui/someFile.cpp)。它然后尝试链接几个相同的目标文件(具有不同的名称),并发现许多缺失的东西。

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

更深层的问题是,你并没有从小处着手。你应该试图建立一个单一的目标文件,注意到这个命令是错误的,并且攻击了那个的问题。

+0

我有一个工作的makefile,但之后我需要在不同目录中组织源代码,这就是当事情发生时。你说得对,我可能比我咀嚼的东西还要多。 –