cmake - 如何根据谁使用它来定义目标库的符号

Posted

技术标签:

【中文标题】cmake - 如何根据谁使用它来定义目标库的符号【英文标题】:cmake - how to define symbol for target library depending on who use it 【发布时间】:2017-06-30 11:23:48 【问题描述】:

我有 cmake 项目,有 3 个子项目。

我们称它为 A,B,C。

A - 子项目 B 和 C 的公共库(静态)。 B 和 C - 独立的可执行文件。

所以我需要以某种方式编译“A”库,以便在“B”中使用特定声明的定义(如 -DUSED_WITHIN_B_MODULE)。

另一方面,“C”可执行文件应该使用用另一组定义编译的“A”(如 -DUSED_WITHIN_C_MODULE)

请建议我如何实现它。 我知道用于 target_compile_definitions 的 PUBLIC/PRIVATE/INTERFACE 修饰符,但我不确定如何将它正确用于依赖树。

将不胜感激,谢谢。

【问题讨论】:

【参考方案1】:

做这样的事情:

add_library(AforB a.cpp)
set_target_properties(AforB PROPERTIES COMPILE_FLAGS -DUSED_WITHIN_B_MODULE)
add_library(AforC a.cpp)
set_target_properties(AforC PROPERTIES COMPILE_FLAGS -DUSED_WITHIN_C_MODULE)

【讨论】:

以上是关于cmake - 如何根据谁使用它来定义目标库的符号的主要内容,如果未能解决你的问题,请参考以下文章

控制共享库的导出符号时,与“gcc -fvisibility=hidden”等效的 CMake 是啥?

如何使用cmake生成基于静态库的动态链接库

使用 g++ 时 HDF5 的未定义符号

使用 CMake 的自定义 .h 和 cpp 的未定义符号 [关闭]

如何在 CMake 中隐藏某些目标?

如何强制 CMake 链接到系统库而不是同名目标