gpt4 book ai didi

c++ - 解决将 Qt 与 cmake 一起使用时的链接错误

转载 作者:行者123 更新时间:2023-11-30 04:46:20 26 4
gpt4 key购买 nike

当我使用以下 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 脚本的解释?


文件没有放在子目录下,如下..

主要.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

服务.cpp

#include "serv.h"

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

}

最佳答案

您的问题出在您对 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()

的参数

关于c++ - 解决将 Qt 与 cmake 一起使用时的链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56824068/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com