使用自定义析构函数时出现"未定义的引用"错误

Whe*_*050 6 c++ root-framework

我正在尝试编写一个需要释放一些内存的类,所以我已经定义了一个自定义析构函数.这被编译为共享库.但是,当我尝试编译一个基本程序来使用该库时,我找不到定义时通常的"未定义引用"错误.如果我删除析构函数,则不会发生这种情况.

这是一个精简的例子:

头文件:

#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_
Run Code Online (Sandbox Code Playgroud)

源文件:

\#include "BL_Skymap.h"

BL_Skymap::BL_Skymap()
{
}

BL_Skymap::~BL_Skymap()
{
}
Run Code Online (Sandbox Code Playgroud)

现在我正在使用的程序就是这样:

\#include "BL_Skymap.h"

int main()
{
  BL_Skymap map;
  return(0);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我正在使用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)'
Run Code Online (Sandbox Code Playgroud)

请注意,root包提供了一个实用程序来生成所需的编译器标志,这是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
Run Code Online (Sandbox Code Playgroud)

UPDATE2:我发现了问题 - 在上面的编译的最后一步,我忘了添加调用root-config,因此libMyLibrary.so没有像它应该的那样链接到ROOT库.

Whe*_*050 2

正如原始问题的更新中所述,我的问题是,当我编译 BL_Skymap.o 对象文件时,我使用了 ROOT 库的相关标志,但当我将对象文件链接在一起以创建 libMyLibrary 时,却没有使用 ROOT 库的相关标志。所以文件。

将 ROOT 标志添加到最后一步解决了问题。