首页 > 解决方案 > 如何从 cmake 子项目中删除或覆盖编译标志

问题描述

我将Nlhomann JSONCMake库作为我的基于父项目的子目录中的子项目。该库由 my 引用,CMakeLists.txt其基本定义如下。问题是,在构建整个项目时,这个库以某种方式在我已经指定的标志之后-std=gnu++11添加了一个不需要的编译器标志。此添加使编译失败,因为我的源代码需要后者。-std=c++2a

你知道如何修改我的 CMakeLists.txt 以便:

  1. json删除子项目中指定的这个特定标志
  2. 强制子项目的编译使用我想要的C++标准

一个答案都可以,但如果你能同时回答两个,那将不胜感激。

# CMakeLists.txt

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_compile_options(-std=c++2a) # repetitive probably

set(JSON_Install OFF CACHE INTERNAL "") # disable installation
add_subdirectory(json)

add_executable(${PROJECT_NAME}
    "main.cpp"
)

target_link_libraries(${PROJECT_NAME} PRIVATE nlohmann_json::nlohmann_json)

我尝试了这个(丑陋的)解决方案,但没有奏效:

get_target_property(_opt_old nlohmann_json INTERFACE_COMPILE_OPTIONS)
string(REPLACE "gnu++11" "c++2a" _opt_new "${_opt_old}")
set_target_properties(nlohmann_json PROPERTIES INTERFACE_COMPILE_OPTIONS "${_opt_new}")

标签: c++cmake

解决方案


推荐阅读