【问题标题】:Portably Compile Entire Directory可移植地编译整个目录
【发布时间】:2011-09-05 17:06:19
【问题描述】:

是否有一种干净/便携的方法可以从给定目录递归下降,将所有找到的 .cpp 文件编译成单个输出文件?我不确定 makefile 是否能够做这种事情,或者它是否是某种构建脚本的工作,但我想避免与我的代码一起维护各种 IDE 的项目文件。

【问题讨论】:

  • 我的投票是首先通过脚本将所有.cpps 组装到一个列表中,然后将该列表作为输入提供给您最喜欢的编译器。由于我不知道可以可靠地跨平台执行此操作的脚本,因此我将保留此作为评论。 :)
  • @Xeo 至少这样我只需要为每个平台编写一次脚本。
  • 你为什么要这样安排你的 .cpp 文件? “输出文件”是什么意思?一个可执行文件,一个库?
  • 这可能会有所帮助:stackoverflow.com/questions/2483182/…(特别是this 答案。)
  • 你的意思是递归 from 给定目录吗?递归通过一个目录没有多大意义。您的意思是要将给定目录和所有子目录中的所有 .cpp 文件编译到单个目标中吗?或者只是一个目录中的所有 .cpp 文件

标签: c++ build makefile compilation


【解决方案1】:

您可以在这里做不同的事情。我建议您使用多平台构建系统,并遵循它的文档。我过去使用过 CMake,但我不知道如何告诉它编译目录中的 all 文件。

优点是用户可以使用 CMake 为大多数常见的 IDE 生成项目文件,因此它允许 VisualStudio 用户生成 VS 解决方案,MacOSX 用户生成 Xcode 项目,几乎任何环境中的 Eclipse CDK 项目,Makefiles。 ..

【讨论】:

    【解决方案2】:

    wildcard function 可以用来匹配这样的模式:

    CXX_FILES = $(wildcard src/*.cpp)   # All .cpp files in the directory
    

    这不是递归的,但至少可以让您不必手动指定某个目录中的文件。构建它们的规则如下所示:

    CXX_FILES = $(wildcard src/*.cpp)   # All .cpp files in the directory
    OBJ_FILES = $(CXX_FILES:src/%.cpp=$(OBJ_DIR)/%.o)   # Corresponding .o files
    
    # Rules
    all: $(OBJ_FILES)
        g++ $(OBJ_FILES) -o output_filename
    
    $(OBJ_DIR)/%.o: src/%.cpp
        g++ -c $< -o $@
    

    哦,回答你的问题,这种方法是完全可移植的。

    【讨论】:

    • 如果它是完全便携,那是否意味着它也可以在CP/M 上运行?因为那个操作系统没有目录的概念。如果你有一个没有 GNU Make 的平台,而你显然依赖于它呢?还是没有安装GCC的系统?
    • +1 因为它回答了问题。但是,我建议使用更新的工具,例如 SConstruct。对于这种情况,收益可能并不明显,但是如果您突然需要编译所有.cpp 除了一个,那么您将拥有 python 的所有功能来帮助您:)
    • @Roland Illig:OP 明确声明他有目录并且他想要编译(也就是说,他声明他有一个编译器)。我不知道 CP/M 是什么,但我的猜测是 OP 也不知道,而且他也不在乎。
    • @ereOn:据记录,CP/M 是早于 DOS 的微型计算机操作系统。该名称代表“微型计算机控制程序”。
    • 这个答案不包括递归下降要求。而且它绝对不可移植:makefile 函数只是 GNU make 的一个特性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2013-10-02
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    相关资源
    最近更新 更多