0

我有一组 C++ 潜在编译器标志存储在一个变量中,并在它之上,我在 CMake 3.14.5上运行以下测试,以查看哪些适用,哪些不适用于某个版本的编译器(I' m 使用GCCCLANGICC编译同一个项目,因此有必要仅对每个相关标志应用):

foreach (FLAG IN LISTS CXX_COMPILER_FLAGS_TO_USE)
    # Check if the compiler supports the flag.
    string(REGEX REPLACE "[-=+]" "" FLAG_NO_SIGNS ${FLAG}) # <- The variable recieving the result of the test can't have those signs in its name
    check_cxx_compiler_flag(${FLAG} CXX_COMPILER_SUPPORTS_${FLAG_NO_SIGNS})
    if(CXX_COMPILER_SUPPORTS_${FLAG_NO_SIGNS})
        message(STATUS "Flag ${FLAG} accepted by C++ compiler")
        string(APPEND CMAKE_CXX_FLAGS " ${FLAG}")
    else()
        message(STATUS "Flag ${FLAG} not accepted by C++ compiler")
    endif()
endforeach()

对于 GCC 8 和-Wabi标志,我得到:

-- Performing Test CXX_COMPILER_SUPPORTS_Wabi
-- Performing Test CXX_COMPILER_SUPPORTS_Wabi - Failed
-- Flag -Wabi not accepted by C++ compiler

现在,如果我没有将标志推入内部CMAKE_CXX_FLAGS,而是使用add_compile_options(),我的测试结果会改变!!!:

foreach (FLAG IN LISTS CXX_COMPILER_FLAGS_TO_USE)
    # Check if the compiler supports the flag.
    string(REGEX REPLACE "[-=+]" "" FLAG_NO_SIGNS ${FLAG})
    check_cxx_compiler_flag(${FLAG} CXX_COMPILER_SUPPORTS_${FLAG_NO_SIGNS})
    if(CXX_COMPILER_SUPPORTS_${FLAG_NO_SIGNS})
        message(STATUS "Flag ${FLAG} accepted by C++ compiler")
        add_compile_options($<$<COMPILE_LANGUAGE:CXX>:${FLAG}>)  # <- ONLY THIS LINE CHANGED
    else()
        message(STATUS "Flag ${FLAG} not accepted by C++ compiler")
    endif()
endforeach()

现在的测试-Wabi报告:

-- Performing Test CXX_COMPILER_SUPPORTS_Wabi
-- Performing Test CXX_COMPILER_SUPPORTS_Wabi - Success
-- Flag -Wabi accepted by C++ compiler  

这导致第二种情况稍后在编译时失败:

cc1plus: error: -Wabi won't warn about anything [-Werror=abi]

这就像add_compile_options()修改了 的结果check_cxx_compiler_flag(),这很奇怪,因为后者在前者之前运行。

只是出于好奇,我在同一个测试中结合了这两种方法(这听起来可能是多余的):

add_compile_options($<$<COMPILE_LANGUAGE:CXX>:${FLAG}>)
string(APPEND CMAKE_CXX_FLAGS " ${FLAG}")

这很有效,意思-Wabi是不会添加到 C++ 文件的编译选项中。

我不希望替换 by 的使用CMAKE_CXX_FLAGSadd_compile_options()改变以前所做的测试结果使用第三个函数。

所以,问题是:我在做我不应该做的事情吗?还是我遇到了真正的错误?

我在知识库中找不到类似的东西,当我将问题发布到CMake 错误跟踪器时,我真的不明白回复。

非常感谢你的帮助。

4

0 回答 0