代码之家  ›  专栏  ›  技术社区  ›  pingw33n

每个项目生成条件库编译

  •  3
  • pingw33n  · 技术社区  · 15 年前

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

        . [root]
        \-- source
            \-- common
                \-- config
                    \-- config.cpp
            \-- project_1
                \-- Jamfile.jam
            \-- project_2
                \-- Jamfile.jam
            \-- project_3
                \-- Jamfile.jam
        \-- Jamroot.jam
    

    果酱:

        project my_project 
            : requirements 
              multi 
              debug:DEBUG
            : default-build
              static
            : build-dir bin
            ;
    
        alias project_1 : source/project_1 ;
        alias project_2 : source/project_2 ;
        alias project_3 : source/project_3 ;
    
        install dist : project_1 project_2 project_3
            : on EXE
            ;
    

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

        project project_N
          : requirements 
              CONFIG_DEFINE_1=
              CONFIG_DEFINE_2=
          ; 
    
        lib config : [ glob ../common/config/*.cpp ] ;
    
        exe project_N 
            : [ glob *.cpp ]  config
            :  
            ;
    

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

    问题是这种方法会导致 配置 每次生成整个项目时都要重新生成的库,而不管文件是否已更改。一、 e.在第一次编译和链接所有内容时构建,在第二次构建时不做任何修改-只有 配置 图书馆是为每个 project_N . 我应该如何正确地设置建筑,以避免出现冗余和编译?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Pieter    15 年前

    据我所知,配置库在不同的项目上共享,并为每个项目使用不同的定义。

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

    如果要避免重新编译,一个选项是将配置库拆分为每个项目的不同库,但取决于 config 看起来,有很多重复的代码也很少需要。。。

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

    e、 g.你有一个源文件 LargeFunction.cpp 具有

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

    将其拆分为三个文件,一个文件包含为DEFINE{1定义的VeryLargeFunction,一个文件包含为DEFINE{2定义的VeryLargeFunction,另一个文件根据DEFINE的值简单地包含这两个文件。

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

    此文件仍然需要每次重新编译,但包含“真实”代码的对象文件将不会。

    您将只在每个编译中重新存在现有的对象文件,I.S.O重新编译所有的内容。

    缺点是更多的维护,不同的函数定义存在于不同的文件中,所以代码变得有点难读。

    推荐文章