C++ 有没有办法将编译器标志从子目录传播到CMake中的整个项目?
我目前遇到的情况是,我需要用一些第三方库来构建我的项目。 其中一个第三方库(比如C++ 有没有办法将编译器标志从子目录传播到CMake中的整个项目?,c++,cmake,C++,Cmake,我目前遇到的情况是,我需要用一些第三方库来构建我的项目。 其中一个第三方库(比如libA)使用GLIBCXX\u USE\u CXX11\u API=0,而其他库使用1(如果两者都可以,则首选1,即第三方库提供了源代码)。这些库是独占的,所以这个问题不是关于如何将不同的ABI链接在一起 现在它可以编译了,如果我仔细地手动选择ABI版本,以及我正在使用的第三方库,命令行将看起来像cmake-DTHIRD\u party\u LIB=LIBA-DUSE\u NEW\u ABI=OFF或cmake-D
libA
)使用GLIBCXX\u USE\u CXX11\u API=0
,而其他库使用1
(如果两者都可以,则首选1
,即第三方库提供了源代码)。这些库是独占的,所以这个问题不是关于如何将不同的ABI链接在一起
现在它可以编译了,如果我仔细地手动选择ABI版本,以及我正在使用的第三方库,命令行将看起来像cmake-DTHIRD\u party\u LIB=LIBA-DUSE\u NEW\u ABI=OFF
或cmake-DTHIRD\u party\u LIB=LIB\u ELSE-DUSE\u NEW\u ABI=ON
。但我不想提供额外的命令行选项-DUSE\u NEW\u ABI
,因为它可以从要使用的库中推断出来
如果我的项目只是一个没有子项目/子目录的简单项目,那么一切都足够简单:我可以检查CMakeLists.txt
中的THIRD\u PARTY\u LIB
并设置相应的编译器定义。但在现实世界中,我需要在全球传播旗帜
假设我有顶级项目T1、T2、T3
,库L4、L5、L6、L\u USE\u 3rd
,每个都在一个单独的目录中L_USE_3rd
是直接使用上述第三方库的确切库,因此我想根据项目中使用的库来决定ABI的逻辑,并将其推广到整个项目中
只要它链接到L\u USE\u 3rd
,target\u add.*()
就可以很容易地将其传递到T1、T2、T3。但似乎不可能将其传递给L4、L5、L6
,这不取决于L\u使用第三个
我知道一个解决方案是将逻辑放入并复制到T1、T2、T3
,但如果第三方库列表将来要更改,这就很难维护了。那么,有没有一种方法可以从一个子目录全局传播编译器标志呢?通常会提供一个需要进行全局设置的文件。像这样:
# third_party/third_party_lib.cmake
include_guard()
function(third_party_setup)
add_definitions(GLIBCXX_USE_CXX11_API=0)
endfunction()
# user cmake
cmake_minimum_required(VERSION 3.11)
include(third_party/third_party_lib.cmake)
third_party_setup() # sets definitions
project(your_project)
add_library(libs ...)
例如,include($ENV{ZEPHYR\u BASE}/cmake/app/boilerplate.cmake NO\u POLICY\u SCOPE)
设置了一些变量,现在它们通过handyfind\u package(ZEPHYR)
接口提供相同的变量。那么目标编译定义有什么问题(L\u使用第三个公共GLIBCXX\u使用cx11\u API=0)
?@KamilCuk但似乎不可能将其传递给L4、L5、L6,因为L4、L5、L6不依赖于L_USE_3rd。所以让他们依赖于它。那么,如果L_USE_3rd也依赖于L4呢?如果…怎么办?静态库允许循环依赖。