0

Захотел создать 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)

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

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

  • А откуда возьмётся специализация float? Её нужно либо явно объявить, либо отказываться от раздельной компиляции. – vp_arth Oct 24 '20 at 16:25
  • Почему реализация шаблонов в .cpp файле? –  Oct 24 '20 at 16:26
  • С помощью реализаций шаблонов в .cpp файле, Я смогу скрыть часть кода от людей ну или что-то типо того... . – RedBull4 Oct 24 '20 at 16:30
  • Но так делать нельзя. Шаблоны ведь не компилируются. Смотрите здесь –  Oct 24 '20 at 16:31
  • А есть альтернатива к template? – RedBull4 Oct 24 '20 at 16:35
  • В библиотеке будет находиться только откомплированый код. Так как шаблоны компилируются индивидуального для каждого случая, они должны находится в хедерах. – AlexGlebe Oct 24 '20 at 16:42
  • Мда... Спасибо за ответ! – RedBull4 Oct 24 '20 at 16:43
  • Вам нужно скомпилировать ве реализации шаблонов и положить их в библиотеку – avp Oct 24 '20 at 16:45
  • Что за "ве"? @avp – RedBull4 Oct 24 '20 at 16:47
  • 1
    Это «все»...... – vp_arth Oct 24 '20 at 16:47
  • Можно же просто задекларировать какие специализации шаблона нужны в библиотеке. Так делать можно. – vp_arth Oct 24 '20 at 16:47
  • Что обозначает задекларировать? : D – RedBull4 Oct 24 '20 at 16:49
  • class vector2<float>; – vp_arth Oct 24 '20 at 16:49
  • Но я хочу чтобы изпользовался class ко всем типам: int, float, double... – RedBull4 Oct 24 '20 at 16:50
  • Тогда извините, вам второй вариант из первого комментария) – vp_arth Oct 24 '20 at 16:51
  • Где-то должен лежать объектный код специализации шаблона для нужного типа. В библиотеке - перечисляйте декларации, там где используется - переносите реализацию в заголовок. – vp_arth Oct 24 '20 at 16:54

0 Answers0