我在javidx9
之后使用CMake
链接我的可执行文件和库。完整的源代码在this repository中。
文件夹中的可执行文件Server.cpp
和Client.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
看起来这是创建可执行文件并将其链接到创建的库所需的唯一两个函数,但我仍然遇到此链接错误,无法找出要更改的内容。请帮助。
1条答案
按热度按时间p8ekf7hl1#
您已经在源文件中实现了模板
ServerInterface<CustomMessageTypes>
。要么将实现移到头文件中(通常就是这样做的),要么通过显式示例化源文件中的模板来提供符号ServerInterface<CustomMessageTypes>
。请参阅Why can templates only be implemented in the header file?和其他无尽的在线资源。以双下划线开头的标识符是保留的。不能在代码中使用它们。