& quot; Неопределенная ссылка & quot; ошибка при использовании пользовательского деструктора

Я пытаюсь написать класс, который должен освободить память, поэтому я определил собственный деструктор. Это скомпилировано как общая библиотека. Однако, когда я пытаюсь скомпилировать базовую программу для использования этой библиотеки, я получаю обычную ошибку «неопределенная ссылка», когда определение не может быть найдено. Если я удалю деструктор, этого не произойдет.

Вот урезанный пример:

Заголовочный файл:

#ifndef _SKYMAP_H_
#define _SKYMAP_H_

#include <vector>
#include "TCanvas.h"
class BL_Skymap {
public:
BL_Skymap();
~BL_Skymap();

protected:
TCanvas mCanvas;
};

#endif //_BENSLIBRARY_SKYMAP_H_

Исходный файл:

\#include "BL_Skymap.h"
BL_Skymap::BL_Skymap()
{
}

BL_Skymap::~BL_Skymap()
{
}

Теперь я использую программу просто так:

\#include "BL_Skymap.h"
int main()
{
BL_Skymap map;
return(0);
}

Обратите внимание, что я использую пакет анализа ROOT (это объект TCanvas). Когда я компилирую небольшую программу выше, я получаю следующие ошибки (класс Skymap скомпилирован в libMyLibrary.so):

g++ test.cpp -o test -lMyLibrary `root-config --cflags --glibs`
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libMyLibrary.so: undefined reference to 'TCanvas::~TCanvas()'
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../../lib/libMyLibrary.so: undefined reference to 'TCanvas::TCanvas(bool)'

Обратите внимание, что корневой пакет предоставляет утилиту для генерации необходимых флагов компилятора, что является целью root-config --cflags --glibs выше.
Что мне здесь не хватает?

ОБНОВЛЕНИЕ: я написал Makefile для выполнения компиляции моей библиотеки, которая выполняет следующее:

g++ -Wall -Wextra -ansi -pedantic --std=c++11 -Isrc -Ihdr -MM -MT 'obj/BL_Skymap.o' src/BL_Skymap.cpp -MF BL_Skymap.d `root-config --cflags --glibs`
g++ -Wall -Wextra -ansi -pedantic --std=c++11 -Isrc -Ihdr -fPIC -o obj/BL_Skymap.o -c src/BL_Skymap.cpp `root-config --cflags --glibs`
g++ -Wall -Wextra -ansi -pedantic --std=c++11 -shared obj/*.o -o libMyLibrary.so

ОБНОВЛЕНИЕ 2: Я нашел проблему — в заключительном шаге в вышеупомянутой компиляции я забыл добавить вызов к root-config и поэтому libMyLibrary.so не было ссылок на библиотеки ROOT, как это должно быть.

6

Решение

Как указывалось в обновлении исходного вопроса, моя проблема заключалась в том, что я использовал соответствующие флаги для библиотек ROOT при компиляции объектного файла BL_Skymap.o, но не при объединении объектного файла для создания libMyLibrary. так файл.

Добавление флагов ROOT к этому последнему шагу устранило проблему.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]