【问题标题】:Writing makefile for source files across different directories为跨不同目录的源文件编写makefile
【发布时间】:2012-04-14 10:55:07
【问题描述】:

当我的源代码文件位于不同的目录时,我一直在编写 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 并将我的源文件分布在不同的目录中。

谢谢!!!

【问题讨论】:

    标签: makefile


    【解决方案1】:

    问题是,

    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
    

    【讨论】:

    • 我还有一个疑问...如果我有 2 个头文件目录,请说 INCLUDE1 和 INCLUDE2。如果头文件存在于 INCLUDE1 和 INCLUDE2 中,它也应该从 INCLUDE2 中获取它,如果它不存在于 INCLUDE2 中,那么它应该从 INCLUDE1 本身中获取它。请帮助修改上述 make 文件以实现这一目标
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 2015-08-14
    相关资源
    最近更新 更多