CMake:使用RELEASE / DEBUG配置发生add_compile_options()错误

时间:2018-02-20 23:09:17

标签: cmake g++ ubuntu-16.04

这有什么问题:

if(CMAKE_COMPILER_IS_GNUCXX OR MINGW OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
    add_compile_options("$<$<CONFIG:RELEASE>:-W -Wall -O3 -pedantic>")
    add_compile_options("$<$<CONFIG:DEBUG>:-W -Wall -O0 -g -pedantic>")
endif()

我明白了:

g++: error: unrecognized command line option ‘-W -Wall -O3 -pedantic’

如果我这样说就可以了:

if(CMAKE_COMPILER_IS_GNUCXX OR MINGW OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
    add_compile_options("$<$<CONFIG:RELEASE>:-W>")
    add_compile_options("$<$<CONFIG:RELEASE>:-Wall>")        
    add_compile_options("$<$<CONFIG:RELEASE>:-O3>")
    add_compile_options("$<$<CONFIG:RELEASE>:-pedantic>")
    add_compile_options("$<$<CONFIG:DEBUG>:-W>")
    add_compile_options("$<$<CONFIG:DEBUG>:-Wall>")
    add_compile_options("$<$<CONFIG:DEBUG>:-g>")
    add_compile_options("$<$<CONFIG:DEBUG>:-O0>")
    add_compile_options("$<$<CONFIG:DEBUG>:-pedantic>")
endif()

......但我猜这不是那样......

2 个答案:

答案 0 :(得分:3)

与包含带有选项的单个字符串的 CMAKE_CXX_FLAGS 变量不同,命令add_compile_options接受分隔的参数每个选择。也就是说,没有生成器表达式,正确的用法是:

add_compile_options("-W" "-Wall" "-O3" "-pedantic")

因此,如果您想使用生成器展示,则需要将其附加到每个选项,就像您第二次尝试一样。

如果您有许多每个配置选项,并且您发现 manual 重复每个tedios的生成器表达式,您可以创建一个简单的函数,为您执行此操作。像这样:

# add_compile_options_config(<CONFIG> <option> ...)
function(add_compile_options_config CONFIG)
    foreach(opt ${ARGN})
        add_compile_options("$<$<CONFIG:${CONFIG}>:${opt}>")
    endforeach()
endfunction()

用法:

add_compile_options_config(RELEASE "-W" "-Wall" "-O3" "-pedantic")
add_compile_options_config(DEBUG "-W" "-Wall" "-O0" "-g" "-pedantic")

如果要将项目中的“-W”,“ - O3”等编译器选项添加到所有目标,但是采用特定于配置的方式,请考虑使用 CMAKE_CXX_FLAGS_&lt; CONFIG&gt; 变量:

string(APPEND CMAKE_CXX_FLAGS_RELEASE " -W -Wall -03 -pedantic")

答案 1 :(得分:2)

我试试了你的例子,可以重现你的问题:

c++: error: unrecognized command line option ‘-W -Wall -O3 -pedantic’

add_compile_options()命令将参数作为选项列表,因此您必须使用;作为分隔符。

以下内容适用于我的gcc / make环境:

add_compile_options("$<$<CONFIG:RELEASE>:-W;-Wall;-O3;-pedantic>")
add_compile_options("$<$<CONFIG:DEBUG>:-W;-Wall;-O0;-g;-pedantic>")

或者写成:

string(
    APPEND _opts
        "$<$<CONFIG:RELEASE>:-W;-Wall;-O3;-pedantic>"
        "$<$<CONFIG:DEBUG>:-W;-Wall;-O0;-g;-pedantic>"
)
add_compile_options("${_opts}")

<强>参考