I am following Asio tutorial by javidx9 and using CMake to link my executables and libraries. Complete source code is available in this repository.
I am facing a linking error with the executables Server.cpp and Client.cpp in folder
- Source
---- Main
-------- Server.cpp
-------- Client.cpp
In the main function if I create the class object CustomServer which inherits from ServerInterface
int main ()
{
CustomServer server(60000);
return 0;
}
I get following linking error:
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
But I have used add_executable in the CMakeList.txt at:
- Source
---- Main
-------- CMakeLists.txt
and target_link_libraries in the main CMakeLists.txt at:
- CMakeLists.txt
It seems like these are the only two functions required to create an executable and link it to a created library but I am still getting this linking error and not able to figure out what to change. Please help.
You have template
ServerInterface<CustomMessageTypes>implemented in a source file. Either move the implementation to a header, which is usually what you do, or provide the symbolServerInterface<CustomMessageTypes>by explicitly instantianting the template in source file. See Why can templates only be implemented in the header file? and other endless online resources.Identifiers starting with double underscores are reserved. You are can't use them in your code.