CMake如何同时检查编译器与链接器标志?
解决方案:用
check_cxx_source_compiles替代分开检查 CMake确实没有直接提供同时检查编译和链接标志的现成函数,但可以通过check_cxx_source_compiles命令间接实现你的需求——这个命令会编译并链接一段简单的测试代码,能完整验证编译链是否支持指定的标志组合,完美解决分开检查可能出现的“编译过了但链接失败”的问题。
具体实现代码如下:
include(CheckCXXSourceCompiles) # 保存当前的编译和链接标志,避免影响后续检查 set(OLD_CXX_FLAGS "${CMAKE_CXX_FLAGS}") set(OLD_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") # 设置要测试的标志组合 set(CMAKE_CXX_FLAGS "${OLD_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize=address -static-libasan") set(CMAKE_EXE_LINKER_FLAGS "${OLD_LINKER_FLAGS} -fno-omit-frame-pointer -fsanitize=address -static-libasan") # 测试一个简单的C++程序能否编译链接成功 check_cxx_source_compiles("int main() { return 0; }" ASAN_STATIC_SUPPORTED) # 恢复原来的标志 set(CMAKE_CXX_FLAGS "${OLD_CXX_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${OLD_LINKER_FLAGS}") # 如果测试通过,启用静态AddressSanitizer if(ASAN_STATIC_SUPPORTED) string(APPEND CMAKE_CXX_FLAGS " -fno-omit-frame-pointer -fsanitize=address -static-libasan") string(APPEND CMAKE_EXE_LINKER_FLAGS " -fno-omit-frame-pointer -fsanitize=address -static-libasan") endif()
为什么这个方法有效?
check_cxx_source_compiles会调用当前配置的C++编译器和链接器,尝试构建一个完整的可执行文件。只有当编译和链接两个步骤都成功时,才会将ASAN_STATIC_SUPPORTED设为ON,这比分开检查编译标志和链接标志更可靠,能准确反映静态ASAN是否真的可用。
内容的提问来源于stack exchange,提问作者jhasse
相关产品推荐
相关产品推荐

