Ошибка неопределённая ссылка при сборке проекта C++, CMake
Я понимаю что это связано с линковкой но не пойму почему этод код не работает.
Есть следующая структура проекта:
1. include
- command.h
- start_command.h
2. src
- command.cpp
- main.cpp
- start_command.cpp
3. CMakeLists.txt
В command.h
#ifndef BOTM8_COMMAND_H
#define BOTM8_COMMAND_H
#include<memory>
#include<string>
class Command
{
public:
template<typename CommandType>
static std::shared_ptr<CommandType> create();
void pri(std::string st);
};
#endif
В start_command.h
#ifndef BOTM8_STARTCOMMAND_H
#define BOTM8_STARTCOMMAND_H
#include"command.h"
class StartCommand : public Command
{
public:
};
#endif
В command.h
#include"command.h"
#include<iostream>
template<typename CommandType>
std::shared_ptr<CommandType> Command::create()
{
return std::make_shared<CommandType>();
}
void Command::pri(std::string st)
{
std::cout<<st<<std::endl;
}
В main.cpp
#include"start_command.h"
int main()
{
auto startCommand = Command::create<StartCommand>();
startCommand->pri("Hi!");
return 0;
}
В start_command.cpp
#include"start_command.h"
В CMakeLists.txt
cmake_minimum_required(VERSION 3.28)
project(test
VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_BUILD}
DESCRIPTION PROJECT_DESCRIPTION
LANGUAGES CXX
)
enable_language(CXX)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(sources
src/command.cpp
src/start_command.cpp
src/main.cpp
)
source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" FILES ${sources})
add_executable(test)
target_sources(test PRIVATE ${sources})
target_include_directories(
test ${warning_guard}
PUBLIC
"\$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
)
Выполняю cmake .. после make и выдаёт ошибку
[25%] Building CXX object CMakeFiles/test.dir/src/command.cpp.o
[50%] Building CXX object CMakeFiles/test.dir/src/start_command.cpp.o
[75%] Building CXX object CMakeFiles/test.dir/src/main.cpp.o [100%]
Linking CXX executable test
***/usr/bin/ld: CMakeFiles/test.dir/src/main.cpp.o: в функции «main»: main.cpp:(.text+0x24): undefined reference to
std::shared_ptr<StartCommand> Command::create<StartCommand>()'***
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/test.dir/build.make:129: test] Ошибка 1
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/test.dir/all] Ошибка 2
make: *** [Makefile:91: all] Ошибка 2