2012-04-14 76 views
2

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

的目录结构如下:

我有我的源文件(.cc的)文件夹中的FOLDER1和FOLDER2和头文件中的文件夹命名包含。我的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那么它的工作原理,但在移动一些文件到文件夹2它给出的未定义引用错误。

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

谢谢!

回答

2

的问题是,

program_C_SRCS := $(wildcard *.cc) 

只增加了在同一目录的源文件。因此,链接时,您没有第二个文件夹的对象文件。你也许可以通过简单地在其他文件夹中的源文件添加到您的program_C_SRCS解决的问题:

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

包括directorys

我猜你正在使用的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 
+0

@Haatschii ....谢谢!它的工作现在。 – 2012-04-14 11:28:02

+0

我还有一个疑问...如果我有2个头文件目录,说INCLUDE1和INCLUDE2。如果头文件存在于INCLUDE1和INCLUDE2中,它也应该从INCLUDE2中提取它,如果它不存在于INCLUDE2中,那么它应该从INCLUDE1本身中提取它。请帮助修改上面的make文件以获得这个 – 2012-04-14 11:44:16

+0

编辑我的回答@KundanKumar – Haatschii 2012-04-14 12:00:35

相关问题