Почему компилятор выдаёт ощибку, при компиляций C++ кода?

Захотел создать shared библиотеку, сама библиотека компилируеться без ощибок. Создал class, под названием "vector2", с использованием template< typename T >, тут тоже без ощибок компилируеться библиотека.

vector2.hpp:

template <typename T>
class vector2
{
public:
    vector2();
    vector2(T x, T y);

    T x = 0, y = 0;
};

vector2.cpp:

template <typename T>
vector2<T>::vector2() {}

template <typename T>
vector2<T>::vector2(T x, T Y)
{
    this->x = x;
    this->y = y;
}

main.cpp:

#include <AceEngine/AceEngine.hpp>

vector2<float> vec;

int main()
{
    
}

Команда компиляций файла main.cpp:

g++ main.cpp -o main -lAceEngine

Ощибка компиляций:

/usr/bin/ld: /tmp/ccj5Nupg.o: in function `__static_initialization_and_destruction_0(int, int)':
main.cpp:(.text+0x38): undefined reference to `ACE::vector2<float>::vector2()'
collect2: error: ld returned 1 exit status

MakeFile, для компиляций библиотеки:

CXX = g++
CXX_FLAGS = -std=c++11 -Wall -Wextra -fPIC

LIBS = -lSDL2 \
       -lSDL2_image \
       -lSDL2_ttf \
       -lSDL2_mixer \
       -lGL

SOURCE_FILES = source_files/*.cpp
HEADER_FILES = header_files/*.hpp

O_FILES = *.o
LIB = libAceEngine.so

LIB_PATH = /usr/lib/x86_64-linux-gnu/
ENGINE_PATH = /usr/include/AceEngine

all:
    $(CXX) $(CXX_FLAGS) -c -fPIC $(SOURCE_FILES) $(LIBS)
    $(CXX) $(CXX_FLAGS) -shared $(O_FILES) -o $(LIB)
    make -f MakeFile clean

install:
    mkdir $(ENGINE_PATH)
    mv $(LIB) $(LIB_PATH)
    cp -r $(HEADER_FILES) $(ENGINE_PATH)

clean:
    rm -rf *.o

uninstall:
    sudo rm -rf $(LIB_PATH)/$(LIB) $(ENGINE_PATH)

Как исправить эту ощибку?

Заранее благодарен!


Ответы (0 шт):