Windows下Clang项目集成Qt6遇CMake编译器标志兼容问题求助
解决Clang编译MSVC版Qt6时的
-permissive-和-Zc:__cplusplus兼容问题 这些错误是因为MSVC版Qt6会自动引入MSVC专属编译选项,而Clang不支持这些参数。以下是具体解决步骤:
方案1:全局移除不兼容编译选项
在CMakeLists.txt中添加针对Clang的选项清理逻辑,位置放在find_package(Qt6)前后均可:
cmake_minimum_required(VERSION 3.16) project(drawing CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 强制使用-std=c++17而非gnu++17,避免Clang兼容问题 # 针对Clang移除MSVC专属编译选项 if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # 移除-permissive- string(REPLACE "-permissive-" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") string(REPLACE "-permissive-" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") # 移除-Zc:__cplusplus(Clang不需要该选项,启用CMAKE_CXX_EXTENSIONS OFF后已正确设置__cplusplus宏) string(REPLACE "-Zc:__cplusplus" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") string(REPLACE "-Zc:__cplusplus" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") endif() set(CMAKE_AUTOMOC TRUE) find_package(Qt6 COMPONENTS Widgets) add_executable("drawing" drawing.cpp) target_link_libraries("drawing" Qt6::Widgets)
方案2:针对Qt目标单独清理选项
如果全局修改会影响其他代码,可仅清理Qt库带来的不兼容选项:
cmake_minimum_required(VERSION 3.16) project(drawing CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_AUTOMOC TRUE) find_package(Qt6 COMPONENTS Widgets) # 针对Clang清理Qt目标的MSVC专属选项 if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") foreach(target IN ITEMS Qt6::Core Qt6::Gui Qt6::Widgets) get_target_property(target_compile_opts ${target} INTERFACE_COMPILE_OPTIONS) list(REMOVE_ITEM target_compile_opts "-permissive-" "-Zc:__cplusplus") set_target_properties(${target} PROPERTIES INTERFACE_COMPILE_OPTIONS "${target_compile_opts}") endforeach() endif() add_executable("drawing" drawing.cpp) target_link_libraries("drawing" Qt6::Widgets)
额外建议:明确指定编译器
为避免CMake误选MSVC编译器,构建时可显式指定Clang:
cmake -H.. -B. -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang
完成上述修改后,重新运行CMake和ninja即可正常构建。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

