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头文件,核心问题有三点:
- 未使用Qt6专属的
qt_add_executable函数:Qt6的CMake模块中,qt_add_executable会自动处理Qt特有的构建逻辑——包括添加头文件路径、处理UI资源、配置GUI程序属性等。而原生add_executable不会触发这些专属配置,即便链接了Qt库,编译器也无法定位头文件。 - 缺失
qt_finalize_executable函数:这是Qt6必填的收尾函数,负责完成可执行文件的最终配置(如设置平台专属程序类型、处理依赖资源),缺失会导致Qt环境配置不完整。 - 链接依赖的作用域与传递机制问题: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
相关产品推荐
相关产品推荐

