c++ - 如何从 cmake 子项目中删除或覆盖编译标志
问题描述
我将Nlhomann JSONCMake
库作为我的基于父项目的子目录中的子项目。该库由 my 引用,CMakeLists.txt
其基本定义如下。问题是,在构建整个项目时,这个库以某种方式在我已经指定的标志之后-std=gnu++11
添加了一个不需要的编译器标志。此添加使编译失败,因为我的源代码需要后者。-std=c++2a
你知道如何修改我的 CMakeLists.txt 以便:
json
删除子项目中指定的这个特定标志- 强制子项目的编译使用我想要的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}")
解决方案
推荐阅读
- xamarin.forms - MapBox 是否支持 Xamarin.Forms (Android/IOS/UWP) 中的室内导航实现?
- javascript - 缓存 - 如何使用它?(在初学者的火力基地中)
- javascript - 在 js 中解决问题
- druid - Apache Druid:当我尝试加载快速启动数据时,我的虚拟机挂起
- javascript - Javascript函数和表达式函数
- sumo - 如何在 SUMO 中以 FIFO 模式产生通行权
- angular - Angular:使用 setInterval 时 Img 元素的 ngIf 行为
- apache-spark - PySpark DataFrame 根据另一列中时间戳值的最小/最大条件更新列值
- spring-mvc - Spring MVC:将字符串传递给后端
- chronicle - 可以在线程之间共享 Chronicle Queue 方法编写器吗?