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

Ubuntu下Clion构建Qt6项目出现QWidget函数未定义错误求助

问题

在Ubuntu系统中通过sudo apt install qt6-base-dev安装Qt6后,在Clion创建Qt6项目并编写了简单窗口代码:

#include <QCoreApplication>
#include <QDebug>
#include <QtWidgets/QWidget>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QWidget window;
    window.resize(320, 240);
    window.show();
    window.setWindowTitle(
            QCoreApplication::translate("toplevel", "Notepad")
    );
    return QCoreApplication::exec();
}

构建时出现链接错误:

/home/usr/CLionProjects/untitled/main.cpp:8:(.text+0x58): undefined reference to `QWidget::QWidget(QWidget*, QFlags<Qt::WindowType>)'
/usr/bin/ld: /home/usr/CLionProjects/untitled/main.cpp:10:(.text+0x7a): undefined reference to `QWidget::show()'
/usr/bin/ld: /home/usr/CLionProjects/untitled/main.cpp:11:(.text+0xb2): undefined reference to `QWidget::setWindowTitle(QString const&)'
/usr/bin/ld: /home/usr/CLionProjects/untitled/main.cpp:15:(.text+0xd2): undefined reference to `QWidget::~QWidget()'
/usr/bin/ld: /home/usr/CLionProjects/untitled/main.cpp:15:(.text+0x119): undefined reference to `QWidget::~QWidget()'
/usr/bin/ld: CMakeFiles/untitled.dir/main.cpp.o: в функции «QWidget::resize(int, int)»:
/usr/include/x86_64-linux-gnu/qt6/QtWidgets/qwidget.h:881:(.text._ZN7QWidget6resizeEii[_ZN7QWidget6resizeEii]+0x48): undefined reference to `QWidget::resize(QSize const&)'
collect2: error: ld returned 1 exit status

项目的CMakeLists.txt内容:

cmake_minimum_required(VERSION 3.26)
project(untitled)

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


find_package(Qt6 COMPONENTS
  Core
  REQUIRED)

add_executable(untitled main.cpp)
target_link_libraries(untitled
  Qt::Core
)

查看Qt6文件时发现头文件有类、命名空间声明,但对应C文件仅含一行#include <A>,重装Qt6无效,如何修复?


解决方法

1. 修正CMakeLists.txt(核心修复)

链接错误的根本原因是未引入Qt6的Widgets组件:QWidget属于Qt Widgets模块,而非Core模块。修改CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.26)
project(untitled)

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

# 添加Widgets组件
find_package(Qt6 COMPONENTS
  Core
  Widgets
  REQUIRED)

add_executable(untitled main.cpp)
# 链接Widgets库
target_link_libraries(untitled
  Qt::Core
  Qt::Widgets
)

2. 修正主程序代码(可选但规范)

GUI程序应使用QApplication而非QCoreApplication(QCoreApplication用于非GUI控制台程序),修改main.cpp:

#include <QApplication> // 替换QCoreApplication
#include <QtWidgets/QWidget>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv); // 替换为QApplication
    QWidget window;
    window.resize(320, 240);
    window.show();
    window.setWindowTitle(
            QApplication::translate("toplevel", "Notepad") // 同步替换
    );
    return QApplication::exec(); // 同步替换
}

3. 关于Qt文件的说明

你看到的仅含#include <A>的C文件是Qt的转发文件,属于正常现象——Qt的功能实现都在预编译的二进制库文件中(如libQt6Widgets.so),这些转发文件只是用于编译时的声明转发,无需担心。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:33:37