我正在尝试编写一个需要释放一些内存的类,所以我定义了一个自定义析构函数。这被编译为共享库。但是,当我尝试编译一个基本程序以使用该库时,当找不到定义时,我会收到通常的“未定义引用”错误。如果我删除析构函数,这不会发生。
这是一个精简的示例:
头文件:
#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
UPDATE2:我发现了问题 - 在上面编译的最后一步中,我忘记添加调用root-config
,因此libMyLibrary.so
没有像它应该有的那样链接到 ROOT 库。