C++ 使用Qt和cmake时解决链接错误

C++ 使用Qt和cmake时解决链接错误,c++,qt,cmake,C++,Qt,Cmake,当我使用下面的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} m

当我使用下面的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();
}

你的问题在于你如何使用

而不是

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


当您
add_library(SERV…
时,您正在创建一个名为
SERV
目标,而不是一个变量
围绕它。其次,您将可执行文件链接到目标库,而不是作为可执行文件的一部分构建目标库。这就是为什么我们将
SERV
添加到
target\u add\u library()
而不是作为
add\u executable()

#include "serv.h"

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

}
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)