我正在尝试编写一个需要释放一些内存的类,因此我定义了一个自定义析构函数。这被编译为共享库。但是,当我尝试编译使用该库的基本程序时,找不到定义时会出现常见的“ undefined reference ”错误。如果删除析构函数,则不会发生。

这是一个简化的示例:

头文件:

#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软件包提供了一个实用程序来生成所需的编译器标志,这是上面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库。

最佳答案

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

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

关于c++ - 使用自定义析构函数时出现"Undefined reference"错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21153961/

10-09 19:56
查看更多