CMake 'add_executable'和'target_link_libraries'引发链接错误

eyh26e7m  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(166)

我在javidx9之后使用CMake链接我的可执行文件和库。完整的源代码在this repository中。
文件夹中的可执行文件Server.cppClient.cpp出现链接错误

- Source
---- Main
-------- Server.cpp
-------- Client.cpp

main函数中,如果我创建从ServerInterface继承的类对象CustomServer

int main ()
{
    CustomServer server(60000);
    return 0;
}

我收到以下链接错误:

Undefined symbols for architecture x86_64:
  "Tachys::Networking::ServerInterface<CustomMessageTypes>::ServerInterface(unsigned short)", referenced from:
      CustomServer::CustomServer(unsigned short) in Server.cpp.o
  "Tachys::Networking::ServerInterface<CustomMessageTypes>::~ServerInterface()", referenced from:
      CustomServer::~CustomServer() in Server.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [Source/Main/exe_server] Error 1
make[1]: *** [Source/Main/CMakeFiles/exe_server.dir/all] Error 2
make: *** [all] Error 2

但是我在CMakeList.txt中使用了add_executable,网址是:

- Source
---- Main
-------- CMakeLists.txt

CMakeLists.txt中的target_link_libraries,位于:

- CMakeLists.txt

看起来这是创建可执行文件并将其链接到创建的库所需的唯一两个函数,但我仍然遇到此链接错误,无法找出要更改的内容。请帮助。

p8ekf7hl

p8ekf7hl1#

您已经在源文件中实现了模板ServerInterface<CustomMessageTypes>。要么将实现移到头文件中(通常就是这样做的),要么通过显式示例化源文件中的模板来提供符号ServerInterface<CustomMessageTypes>。请参阅Why can templates only be implemented in the header file?和其他无尽的在线资源。

__Start__

以双下划线开头的标识符是保留的。不能在代码中使用它们。

相关问题