3

我有使用 Boost.Build 构建的 C++ 项目。该项目由3个子项目组成。

    . [根]
    \ -  资源
        \ -  常见的
            \-- 配置
                \-- 配置.cpp
        \-- 项目_1
            \-- Jamfile.jam
        \-- 项目_2
            \-- Jamfile.jam
        \-- 项目_3
            \-- Jamfile.jam
    \-- Jamroot.jam

Jamroot.jam:

    项目 my_project
        : 要求
          多
          调试:调试
        :默认构建
          静止的
        : 构建目录 bin
        ;

    别名 project_1 : source/project_1 ;
    别名 project_2 : source/project_2 ;
    别名 project_3 : source/project_3 ;

    安装 dist : project_1 project_2 project_3
        : 在EXE上
        ;

根据此模板,每个项目都有 Jamfile.jam:

    项目项目_N
      : 要求
          CONFIG_DEFINE_1=
          CONFIG_DEFINE_2=
      ;

    库配置:[glob ../common/config/*.cpp];

    exe项目_N
        : [ glob *.cpp ] 配置
        :  
        ;

config.cpp使用定义CONFIG_DEFINE_1CONFIG_DEFINE_2条件编译(实际上它们只是常量),因此config每个项目都有一个单独的库版本。

问题是这种方法会导致config每次构建整个项目时都重新构建库,无论文件是否更改。即第一次构建所有东西都被编译和链接,第二次构建而不做任何修改 - 只config为每个构建库project_N。我应该如何正确设置建筑物,以免发生冗余编译?

4

1 回答 1

1

据我了解,您的配置库在不同的项目中共享,并为每个项目使用不同的定义。

在这种情况下,无论 boost build. 或任何其他构建系统如何,都无法克服重新编译。在 cpp 文件的编译之间,预处理文件更改。

如果您想避免重新编译,一种选择是将配置库拆分为每个项目的不同库,但根据config外观,也很少需要大量代码重复......

我能想到的唯一其他选择是减少每次都需要重新编译的代码量。

例如你有一个源LargeFunction.cpp文件

 #if CONFIG_DEFINE_1
     void VeryLargeFunction() {
        ...
     }
 #elif CONFIG_DEFINE_2
     void VeryLargeFunction() {
        ...
     }
 #endif

将其拆分为三个文件,一个包含为 DEFINE_1 定义的 VeryLargeFunction,一个为 DEFINE_2 定义,另一个仅根据定义的值包含这两个文件。

 #if CONFIG_DEFINE_1
    #include "definitionFileFor1"
 #elif CONFIG_DEFINE_2
    #include "definitionFileFor2"
 #endif

该文件仍然需要每次重新编译,但包含“真实”代码的目标文件不会。

您实际上只会在每次编译时重新链接现有的目标文件,iso 重新编译所有内容。

缺点是需要更多的维护,并且不同的函数定义驻留在不同的文件中,因此代码变得有点难以阅读。

于 2009-09-09T11:58:09.897 回答