在将 Qt 与 cmake 结合使用时解决链接错误

Posted

技术标签:

【中文标题】在将 Qt 与 cmake 结合使用时解决链接错误【英文标题】:resolving linking errors while using Qt with cmake 【发布时间】:2019-06-30 10:21:45 【问题描述】:

当我使用以下 CMake 脚本构建时,项目构建时没有错误。

cmake_minimum_required(VERSION 3.0.0)
project(asdqwdw VERSION 0.1 LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
find_package(Qt5 COMPONENTS
    Core
    REQUIRED)
add_executable($PROJECT_NAME main.cpp  serv.h serv.cpp)
target_link_libraries($PROJECT_NAME Qt5::Core)

但是当我使用以下 CMake 脚本时,

cmake_minimum_required(VERSION 3.0.0)
project(asdqwdw VERSION 0.1 LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
find_package(Qt5 COMPONENTS
    Core
    REQUIRED)
add_library(SERV serv.h serv.cpp)
target_link_libraries(SERV Qt5::Core)
add_executable($PROJECT_NAME main.cpp  $SERV)
target_link_libraries($PROJECT_NAME Qt5::Core)

我收到此错误,

CMakeFiles/asdqwdw.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x45): undefined reference to `serv::serv(QObject*)'
CMakeFiles/asdqwdw.dir/main.cpp.o: In function `serv::~serv()':
main.cpp:(.text._ZN4servD2Ev[_ZN4servD5Ev]+0xf): undefined reference 
to `vtable for serv' 
collect2: error: ld returned 1 exit status 
make[2]: *** [asdqwdw] Error 1
make[1]: *** [CMakeFiles/asdqwdw.dir/all] Error 2 
make: *** [all] Error 2

有没有解释为什么我不能使用后一个 CMake 脚本而不是前者?


文件不放在子目录下,如下..

main.cpp

#include <QCoreApplication>
#include "serv.h"
int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);
    serv dat;
    return a.exec();

serv.h

#ifndef SERV_H
#define SERV_H

#include <QObject>
class serv : public QObject

    Q_OBJECT
public:
    explicit serv(QObject *parent = nullptr);

signals:

public slots:
;

#endif // SERV_H

serv.cpp

#include "serv.h"

serv::serv(QObject *parent) :
    QObject(parent)



【问题讨论】:

【参考方案1】:

你的问题在于你使用add_executable

代替

add_executable($PROJECT_NAME main.cpp  $SERV)
target_link_libraries($PROJECT_NAME Qt5::Core)

add_executable($PROJECT_NAME main.cpp)
target_link_libraries($PROJECT_NAME SERV Qt5::Core)

当您 add_library(SERV ... 时,您正在创建一个名为 SERVTARGET,而不是变量。所以首先,你不需要在它周围使用$...。其次,您将可执行文件链接到目标库,而不是将目标库构建为可执行文件的一部分。这就是为什么我们将SERV 添加到target_add_library() 而不是作为add_executable() 的参数

【讨论】:

以上是关于在将 Qt 与 cmake 结合使用时解决链接错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac OSX 上将 DCMTK 与 Qt 链接

OpenCV2.4.9 With Qt5.3.1 开发环境配置问题解决篇

使用 Cmake 文件在 Visual Studio 中构建 Qt 项目时出现链接错误

为啥在将 liblas 链接到 Qt 后出现未定义的参考错误?

OpenCV2.4.9 Qt5.3.1 开发环境配置错误原因与解决方案

与 CMake 和 Visual Studio 2010 的链接错误