makefile - 为不同目录下的源文件编写makefile

标签 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 时,它会给出 undefined reference 的错误。

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

谢谢!!!

最佳答案

问题是,

program_C_SRCS := $(wildcard *.cc)

仅在同一目录中添加源文件。因此,链接时您没有第二个文件夹的目标文件。您只需将其他文件夹的源文件添加到您的程序中就可以解决问题_C_SRCS:

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

包含目录

我猜你正在使用 gcc/g++,在本例中 http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html表示从左到右搜索 header 路径,这意味着首先搜索给定的第一个路径。因此,您只需在 -I INCLUDE1 选项之前添加 -I INCLUDE2 即可实现您想要的。 您的起始 makefile 已经对多个包含路径进行了一些转换:

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

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

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

关于makefile - 为不同目录下的源文件编写makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10153044/

相关文章:

C - 函数具有内部链接但未定义

c - 对 `dlsym' 的 undefined reference Learn C The Hard Way

c -/usr/bin/x86_64-linux-gnu-ld : cannot find?

c++ - 带有 header 的 Makefile 包括 header

c - 如何正确链接 KBuild Makefile 以在内核模块中构建子文件夹

c - 制作和增量构建

细化算法的C++代码(EVG-thin)

c++ - 仅抑制实际的 make 命令和最终的 print 语句

c++ - 如何从多个需要外部依赖项的 .o 文件创建可执行文件?

c++ - 在一个 Makefile 中编译 C++ 和 C