我有一组 C++ 潜在编译器标志存储在一个变量中,并在它之上,我在 CMake 3.14.5上运行以下测试,以查看哪些适用,哪些不适用于某个版本的编译器(I' m 使用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++ 文件的编译选项中。
我不希望替换 by 的使用CMAKE_CXX_FLAGS
会add_compile_options()
改变以前所做的测试结果并使用第三个函数。
所以,问题是:我在做我不应该做的事情吗?还是我遇到了真正的错误?
我在知识库中找不到类似的东西,当我将问题发布到CMake 错误跟踪器时,我真的不明白回复。
非常感谢你的帮助。