【问题标题】:Disable -Werror for one of CMakeLists.txt为 CMakeLists.txt 之一禁用 -Werror
【发布时间】:2016-12-16 10:54:57
【问题描述】:

我有以下 CMake 文件:

project(MyLib)
cmake_minimum_required(VERSION 2.8)

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "release")
endif()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Werror")
set(ROOT_DIR ${CMAKE_SOURCE_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${ROOT_DIR}/bin/${CMAKE_BUILD_TYPE})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${ROOT_DIR}/bin/${CMAKE_BUILD_TYPE})
set(MAIN_LIBRARY_NAME "mylib")

add_subdirectory(src)
add_subdirectory(test_app)
add_subdirectory(test_app1) <--- I want to disable -Werror flag for CMakeLists.txt in this folder.
add_subdirectory(test_app2)

如何禁用子目录之一的 -Werror 标志?在每个子目录中,我也有 CMakeLists.txt。

【问题讨论】:

  • 在您调用add_subdirectory() 时,所有变量和目录属性都会复制到子目录的上下文中。要么在此调用之前修改CMAKE_CXX_FLAGS,要么在此调用之后使用add_compile_options() 并修改COMPILE_OPTIONS 子目录属性。
  • @Florian 我想说的不完全是重复的。此问题的答案包含在该问题中,而不是其中一个答案中。
  • @Antonio 所以我需要像这个问题中的例子一样:stackoverflow.com/questions/33828855/...?
  • @Antonio 或者我可以添加一些编译选项?据我了解,我可以在 add_subdirectory(test_app1) 之后使用 add_compile_options() ,还是我弄错了?
  • @VolodymyrHnatiuk 你应该把add_compile_options放在子目录CMakeLists.txt文件的开头。它的所有子子目录都将继承这些选项。

标签: cmake


【解决方案1】:

把我的评论变成答案

在您调用add_subdirectory() 时,所有变量和目录属性都会复制到子目录的上下文中。在此调用之前修改CMAKE_CXX_FLAGS 类似

string(REPLACE " -Werror" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
add_subdirectory(test_app1) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")

或者使用“旧方式”编译器标志可以用add_definitions() 给出并用remove_definitions() 删除

add_definitions(-std=c++11 -Wall -Werror)
...
remove_definitions(-Werror)
add_subdirectory(test_app1)
add_definitions(-Werror)

但是您可以 - 与我的第一条评论相矛盾 - 仅在目标级别 COMPILE_OPTIONS 属性上更改添加的标志 add_compile_options() 而不是完整目录。创建目标时,属性会按原样从目录复制到目标,以后更改目录属性不会自动更新目标的属性。

如果您有支持SOURCE_DIR 目标属性的较新 CMake 版本,您也可以使用一些疯狂的生成器表达式:

add_compile_options(
    -std=c++11 
    -Wall 
    $<$<NOT:$<STREQUAL:$<TARGET_PROPERTY:SOURCE_DIR>,${CMAKE_SOURCE_DIR}/test_app1>>:-Werror>
)

参考

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2019-12-02
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多