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)
设置了一些变量,现在它们通过handy
find\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呢?如果…怎么办?静态库允许循环依赖。