我在变量中存储了一组C ++潜在的编译器标志,并在其上进行了测试,我在CMake 3.14.5 上运行以下测试,以查看哪些适用和哪些不适用到特定版本的编译器(我使用 GCC , CLANG 和 ICC 来编译同一项目,因此有必要将其应用于每个都只有相关标志):
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 ++文件的编译选项中。
我不希望将 CMAKE_CXX_FLAGS
的使用替换为 add_compile_options()
会大大改变所做测试的结果并使用第三个功能。
因此,问题是:我在做我不应该做的事情吗?还是我遇到了真正的错误?
我在知识库中找不到任何类似的内容,当我将问题发布到CMake bug tracker时,我真的不理解响应。
非常感谢您的帮助。