奇怪的未定义引用了`vtable
strange undefined reference to `vtable
我已将"undefined reference to vtable..."
困住了一整天。
实际上,我看到了许多与"undefined reference to vtable..."
例如:
未定义的引用"交易"
对VTable的不确定引用
https://gcc.gnu.org/faq.html#vtables
对VTable的不确定引用
有些人的问题是忘记编写虚拟功能,有些人忘记了将.cpp文件添加到构建目录中。但是我想我已经注意到了。
我想做以下步骤:
- 我希望将
A_1
和A_2
类编译到共享库libA
。A_2
衍生自A_1
。
a_1.h
#ifndef include_A_1_h
#define include_A_1_h
class A_1
{
public:
A_1() {}
virtual ~A_1() {} // not pure-virtual function has defined
virtual void print() = 0;
private:
};
#endif
a_2.h
#ifndef include_A_2_h
#define include_A_2_h
#include "A_1.h"
class A_2 : public A_1
{
public:
A_2() {}
~A_2() {}
virtual void print();
private:
};
#endif
a_2.cpp
#include "A_2.h"
void A_2::print()
{
// empty
}
- 我希望编译类
B_1
和B_2
到共享库libB
。B_1
和B_2
是独立的。
b_1.h
#ifndef include_B_1_h
#define include_B_1_h
#include <iostream>
#include <string.h>
class B_1
{
public:
B_1(const std::string &path);
~B_1();
private:
};
#endif
b_1.cpp
#include "B_1.h"
B_1::B_1(const std::string &path)
{
}
B_1::~B_1()
{
}
b_2.h
#ifndef include_B_2_h
#define include_B_2_h
class B_2
{
public:
B_2() {}
~B_2() {}
void fun();
private:
};
#endif
b_2.cpp
#include "B_2.h"
#include "A_1.h"
#include "A_2.h"
void B_2::fun()
{
A_1 *ptr = new A_2;
}
- 我想在
main.cpp
中使用两个共享库。在这里,有些问题出了问题。
main.cpp
#include "B_1.h"
int main()
{
B_1 b1("name");
}
我正在使用以下命令进行编译:
g++ A_2.cpp -fPIC -shared -o libA.so
g++ B_1.cpp B_2.cpp -fPIC -shared -o libB.so
g++ main.cpp -L . -lA -lB
编译器说:
./libB.so: undefined reference to `vtable for A_2'
您可以看到许多空功能,因为我忽略了一些无关的代码。但是在这种情况下,它仍然存在错误。
有人可以帮我吗?谢谢。
在编译库时也提供共享库a。
g++ B_1.cpp B_2.cpp -L . -lA -fPIC -shared -o libB.so
简单地说(我不是该主题的专家(,引擎盖下的G 使用的LD链接器是报告未定义符号的一个。当汇编MAIN时,通过提供LIBA来解决LIBB中未解决的符号,因为使用LIBB解决了所有使用的明确明确的符号。
。默认情况下:
- 编译可执行文件时,如果有未定义的符号,LD会失败
- 编译库时,如果有未定义的符号,LD不会失败
以后允许您做很多灵活的事情,其中包括库之间的循环依赖性(这里也可能取决于libb(。
要在第二步失败,您需要使用-z defs
明确告诉链接器如果有未定义的符号,则会失败。
g++ B1.cpp B2.cpp -z defs -fPIC -shared -o libB.so
/tmp/cchjkdnak.o:在函数
A_2::A_2()': B2.cpp:(.text._ZN3A_2C2Ev[_ZN3A_2C5Ev]+0x1b): undefined reference to
vtable for a_2'collect2:错误:ld返回1退出状态
如果main.cpp写为:
,您的汇编指令将有效#include "A_2.h"
#include "B_1.h"
int main()
{
A_1 *ptr = new A_2;
B_1 b1("name");
}
liba将被加载以在主要的符号中解析符号,并且这些符号将用于libb的缺失符号。
有关更多信息:Linux Journal上有一篇不错的文章,该文章更深入符号分辨率
- 纯虚拟类和错误未定义对 'vtable 的引用
- 对植物的 vtable 的未定义引用?
- 使用多个命名空间对 vtable 的未定义引用
- 对"车辆的 vtable"的未定义引用 - 面向对象的编程练习
- Qt Quick + CMake + 自定义 QObject 导致对"vtable"的未定义引用
- C++ 未定义对 vtable 异常的引用
- 为每个抽象函数定义主体后,对VTable的不确定引用
- 看起来如此主要的错误.cpp:(.text.startup+0xd6):未定义对"vtable for Counter"的引用?
- 用嵌套类对VTable的未定义引用
- 未定义对 vtable 错误的引用
- 对'vtable for class'的未定义引用
- 奇怪的未定义引用了`vtable
- 构造函数中对"vtable"的未定义引用
- C++ 继承问题:未定义对"vtable"的引用
- 构造函数中对 vtable 的未定义引用
- 在 qt 控制台应用程序中未定义对 'vtable for myObj' 的引用 - 信号和插槽
- 对"vtable for "命名空间继承的未定义引用 对"类型信息"的未定义引用
- 对具有继承的 vtable 的未定义引用
- 实现虚拟函数时对 vtable 的未定义引用
- Qt:未定义的对'vtable'引用