问题:2个可执行文件,1个核心库,if / defs在里面
在ĽubomírCarik的帮助下UPD2
每个可执行文件都设置自己的预处理程序标志 最初,创建了目标库
add_library(common_library STATIC ${__SOURCES} ${__HEADERS})
common_library 代码(静态库,自己的cmake文件)具有预处理器条件
#if defined(MY_DEFINE_1)
// specific code #1
#elif defined (MY_DEFINE_2)
// specific code #2
#else
// error
#endif
我在使用CMake准备这样的配置时遇到问题。库没有看到定义。 第一个可执行文件(自己的cmake):
target_compile_definitions(common_library PRIVATE -DMY_DEFINE_1)
add_executable(BINARY_1 ${bin1_sources} )
add_dependencies(BINARY_1 common_library)
第二个可执行文件(自己的cmake):
target_compile_definitions(common_library PRIVATE -DMY_DEFINE_2)
add_executable(BINARY_2 ${bin2_sources} )
add_dependencies(BINARY_2 common_library)
但 common_library 只构建一次,有2个定义。它应该为每个二进制文件单独构建。
答案 0 :(得分:1)
您应该使用target_compile_options和target_compile_definitions代替全局' add_definitions'。并为library_1和library_2设置不同的定义。
答案 1 :(得分:1)
由于您正在尝试更改库上的编译器标志,因此您需要多次构建库。您现在正在做的是多次更改库上的标志,这就是您在构建中看到两组编译器定义的原因。
解决问题的最简单方法是创建两个库条目,每个条目都有自己的标记。这是我能想到的最小的例子:
project("sample"
LANGUAGES
C
)
add_library(lib1 STATIC foo.c)
target_compile_definitions(lib1
PRIVATE -DCOND=1
)
add_library(lib2 STATIC foo.c)
target_compile_definitions(lib2
PRIVATE -DCOND=0
)
我的foo.c
看起来像这样:
#if COND
#warning "case 1"
#else
#warning "case 2"
#endif
void foo() { }
构建如下:
$ make
Scanning dependencies of target lib1
[ 25%] Building C object CMakeFiles/lib1.dir/foo.o
/tmp/so/static-lib/foo.c:2:2: warning: #warning "case 1" [-Wcpp]
#warning "case 1"
^~~~~~~
[ 50%] Linking C static library liblib1.a
[ 50%] Built target lib1
Scanning dependencies of target lib2
[ 75%] Building C object CMakeFiles/lib2.dir/foo.o
/tmp/so/static-lib/foo.c:4:2: warning: #warning "case 2" [-Wcpp]
#warning "case 2"
^~~~~~~
[100%] Linking C static library liblib2.a
[100%] Built target lib2
如果大多数库代码相同,则可以通过使用三个库来限制编译时间(例如,真正通用的代码,然后是仅包含条件编译内容的库)。