You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:12:22