我有使用Boost.Build构建的C ++项目。该项目由3个子项目组成。
. [root] \-- source \-- common \-- config \-- config.cpp \-- project_1 \-- Jamfile.jam \-- project_2 \-- Jamfile.jam \-- project_3 \-- Jamfile.jam \-- Jamroot.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
库版本。
问题是这样的方法会导致每次构建整个项目时都重建config
库,无论文件是否更改。即构建第一次编译和链接所有内容,第二次构建而不进行任何修改 - 只为每个config
构建project_N
库。我应该如何正确设置建筑物,以免发生冗余和编译?
答案 0 :(得分:1)
据我了解,您的配置库在不同的项目中共享,并为每个项目使用不同的定义。
在这种情况下无法克服重新编译,无论是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定义,另一个根据定义的值仅包含这两个文件。
#if CONFIG_DEFINE_1
#include "definitionFileFor1"
#elif CONFIG_DEFINE_2
#include "definitionFileFor2"
#endif
此文件仍然需要每次都重新编译,但包含“真实”代码的目标文件不会。
您实际上只会在每次编译时重新链接现有的目标文件i.s.o.重新编译一切。
缺点是维护更多,并且不同的函数定义驻留在不同的文件中,因此代码变得有点难以阅读。