在将 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 ...
时,您正在创建一个名为 SERV
的 TARGET
,而不是变量。所以首先,你不需要在它周围使用$...
。其次,您将可执行文件链接到目标库,而不是将目标库构建为可执行文件的一部分。这就是为什么我们将SERV
添加到target_add_library()
而不是作为add_executable()
的参数
【讨论】:
以上是关于在将 Qt 与 cmake 结合使用时解决链接错误的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV2.4.9 With Qt5.3.1 开发环境配置问题解决篇
使用 Cmake 文件在 Visual Studio 中构建 Qt 项目时出现链接错误
为啥在将 liblas 链接到 Qt 后出现未定义的参考错误?