使用自定义析构函数时出现"Undefined reference"错误
"Undefined reference" error when using custom destructor
我正试图编写一个需要释放一些内存的类,所以我定义了一个自定义析构函数。这是作为共享库编译的。然而,当我试图编译一个基本程序来使用该库时,当找不到定义时,我会遇到常见的"未定义引用"错误。如果我移除析构函数,就不会发生这种情况。
下面是一个简单的例子:
头文件:
#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库。
正如原始问题的更新中所述,我的问题是在编译BL_Skymap.o对象文件时使用了ROOT库的相关标志,但在将对象文件链接到一起以生成libMyLibrary.so文件时没有使用。
在最后一步中添加ROOT标志解决了这个问题。
相关文章:
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- 为什么在使用 SDL2 时仍然收到'undefined reference'链接器错误?
- OpenCV undefined reference to 'cv::imread(cv::String const&, int)'
- Libcurl c++ "undefined reference to" (Windows/MinGW/g++)
- 尝试使用 extern "C" 调用 C 中的C++方法,得到"undefined reference to"对象的链接器错误
- build error : undefined reference to `yyFlexLexer::yyFlexLex
- 安卓 NDK 制造。数百"undefined reference error"
- 当我尝试进行TPC-E测试时,实用程序抱怨"undefined reference"
- 声明和定义函数静态会产生"undefined reference to function_name()"
- C++ : "undefined reference to"可能是因为CMake文件
- 包含<iostream>时"Undefined reference"错误
- CMake 'undefined reference' CERN-ROOT 的错误
- 生成错误:"cannot find target for file"和"undefined reference"
- AppData\Local\Temp\cc59LXDc.o:test1.cpp: undefined reference to 'constructNewObjectOfClass
- YAML-cpp 编译错误:"undefined reference to YAML::LoadFile"
- 添加 cpp11 插件时出现错误消息"Undefined reference to boost (...)"