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

CLion自动生成的CMakeLists.txt无法适配Qt的原因及解决

问题描述

在Ubuntu 23.04系统中使用CLion搭配Qt6开发项目时,CLion自动生成的CMakeLists.txt编译报错,但Qt Creator生成的CMakeLists.txt在CLion中能正常编译,需排查原因。Qt6库位于/usr/include/x86_64-linux-gnu/qt6目录。


相关文件与错误信息

CLion自动生成的CMakeLists.txt

cmake_minimum_required(VERSION 3.25)
project(untitled4)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

find_package(Qt6 COMPONENTS
        Core
        Gui
        Widgets
        REQUIRED)

add_executable(untitled4 main.cpp)
target_link_libraries(untitled4
        Qt6::Core
        Qt6::Gui
        Qt6::Widgets
        )

项目main.cpp

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    QPushButton button("Hello world!", nullptr);
    button.resize(200, 100);
    button.show();
    return QApplication::exec();
}

编译错误日志

/home/xxx/CLionProjects/untitled4/main.cpp:1:10: fatal error: QApplication: No such file or directory
    1 | #include <QApplication>
      |          ^~~~~~~~~~~~~~
compilation terminated.

Qt Creator生成的可正常编译的CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(untitled3 VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

set(PROJECT_SOURCES
        main.cpp
        )

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(untitled3
            MANUAL_FINALIZATION
            ${PROJECT_SOURCES}
            )
    # Define target properties for Android with Qt 6 as:
    #    set_property(TARGET untitled APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
    #                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
else()
    if(ANDROID)
        add_library(untitled3 SHARED
                ${PROJECT_SOURCES}
                )
        # Define properties for Android with Qt 5 after find_package() calls as:
        #    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(untitled3
                ${PROJECT_SOURCES}
                )
    endif()
endif()

target_link_libraries(untitled3 PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

set_target_properties(untitled3 PROPERTIES
        MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
        MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
        MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
        MACOSX_BUNDLE TRUE
        WIN32_EXECUTABLE TRUE
        )

install(TARGETS untitled3
        BUNDLE DESTINATION .
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
        )

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(untitled3)
endif()

原因分析

CLion自动生成的配置未遵循Qt6官方推荐的CMake构建流程,导致编译器无法找到Qt头文件,核心问题有三点:

  1. 未使用Qt6专属的qt_add_executable函数:Qt6的CMake模块中,qt_add_executable会自动处理Qt特有的构建逻辑——包括添加头文件路径、处理UI资源、配置GUI程序属性等。而原生add_executable不会触发这些专属配置,即便链接了Qt库,编译器也无法定位头文件。
  2. 缺失qt_finalize_executable函数:这是Qt6必填的收尾函数,负责完成可执行文件的最终配置(如设置平台专属程序类型、处理依赖资源),缺失会导致Qt环境配置不完整。
  3. 链接依赖的作用域与传递机制问题:Qt Creator配置中使用PRIVATE关键字限定链接作用域,Qt的CMake模块会在链接时自动传递头文件路径等信息;而CLion生成的配置未使用该关键字,且原生add_executable无法触发Qt的依赖传递逻辑。

修复方案

修改CLion生成的CMakeLists.txt,遵循Qt6官方CMake规范:

cmake_minimum_required(VERSION 3.25)
project(untitled4)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

find_package(Qt6 REQUIRED COMPONENTS Widgets)

# 使用Qt6专属函数创建可执行文件
qt_add_executable(untitled4
    MANUAL_FINALIZATION
    main.cpp
)

# 限定链接依赖作用域为PRIVATE,自动传递头文件路径
target_link_libraries(untitled4 PRIVATE Qt6::Widgets)

# 设置GUI程序属性
set_target_properties(untitled4 PROPERTIES
    WIN32_EXECUTABLE TRUE
    MACOSX_BUNDLE TRUE
)

# 完成Qt6可执行文件的最终配置
qt_finalize_executable(untitled4)

内容的提问来源于stack exchange,提问作者ShyLock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 07:37:52