在不同目录中编写源文件的makefile

时间:2012-04-14 10:55:08

标签: makefile

当我的源代码文件在不同的目录中时,我被困在编写Makefile。

目录结构如下:

我的源文件(.cc)位于文件夹FOLDER1和FOLDER2中,头文件位于名为INCLUDE的文件夹中。我的makefile出现在FOLDER1中。

       program_NAME := myprogram
       program_C_SRCS := $(wildcard *.cc)
       program_C_OBJS := ${program_C_SRCS:.cc=.o}
       program_OBJS := $(program_C_OBJS) 
       program_INCLUDE_DIRS := ../INCLUDE
       program_LIBRARY_DIRS := 
       program_LIBRARIES :=
       CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
       LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
       LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library))

       .PHONY: all clean distclean

       all: $(program_NAME)

       $(program_NAME): $(program_OBJS)
       $(LINK.cc) $(program_OBJS) -o $(program_NAME)

       clean:
           @- $(RM) $(program_NAME)
           @- $(RM) $(program_OBJS)

       distclean: clean

如果我将所有源(.cc)文件保存在FOLDER1中,那么它可以工作,但是在将一些文件移动到FOLDER2时会出现未定义引用的错误。

请帮助我了解如何修改我的makefile,以便我可以将所有头文件保存在一个目录中,说INCLUDE并将我的源文件分发到不同的目录。

谢谢!!!

1 个答案:

答案 0 :(得分:2)

问题是,

program_C_SRCS := $(wildcard *.cc)

仅在同一目录中添加源文件。因此,在链接时,您没有第二个文件夹的目标文件。您可以通过简单地将另一个文件夹的源文件添加到program_C_SRCS来解决问题:

program_C_SRCS += $(wildcard ../FOLDER2/*.cc)

包括导演

我猜你正在使用gcc / g ++,在这种情况下http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html说,从左到右搜索标题路径,这意味着首先搜索给定的第一个路径。因此,您只需在-I INCLUDE1选项之前添加-I INCLUDE2即可获得所需内容。 您的起始makefile已经有一些转换,包含多个包含路径构建:

   CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))

所以你只需重写你的包含路径:

program_INCLUDE_DIRS := ../INCLUDE2
program_INCLUDE_DIRS += ../INCLUDE1