gpt4 book ai didi

c++ - 奇怪的 undefined reference `vtable

转载 作者:IT老高 更新时间:2023-10-28 23:18:36 25 4
gpt4 key购买 nike

我在"undefined reference to vtable..."中困了一整天。

其实我见过很多关于"undefined reference to vtable..."的回答处理

例如:

undefined reference to vtable "Transaction"

Undefined reference to vtable

https://gcc.gnu.org/faq.html#vtables

Undefined reference to vtable

有些人的问题是忘记写虚函数,有些人忘记将.cpp文件添加到构建目录中。但我想我已经注意到了。

我想做以下步骤:

  • 我想将类 A_1A_2 编译成一个共享库 libAA_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_1B_2 编译成一个共享库 libBB_1B_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'

你可以看到很多空函数,因为我忽略了一些不相关的代码。但在这种情况下,它仍然有错误。

谁能帮帮我?谢谢。

最佳答案

在编译库 B 时也提供共享库 A。

g++ B_1.cpp B_2.cpp  -L . -lA  -fPIC -shared -o libB.so

简单地说(我不是该主题的专家),g++ 在后台使用的 ld 链接器是报告 undefined symbol 的链接器。编译 main 时,libB 中未解析的符号不会通过提供 libA 来解析,因为 main 中显式使用的所有符号都是使用 libB 解析的。

默认情况下:

  • 编译可执行文件时,如果有 undefined symbol ,ld 会失败
  • 编译库时,如果有 undefined symbol ,ld 不会失败

后者允许你做很多灵活的事情,其中​​包括库之间的循环依赖(这里libA也可以依赖于libB)。

要在第二步失败,您需要使用 -z defs 明确告诉链接器在存在 undefined symbol 时失败。

g++ B1.cpp B2.cpp -z defs -fPIC -shared -o libB.so

/tmp/cchjkdnAk.o: In function A_2::A_2()':
B2.cpp:(.text._ZN3A_2C2Ev[_ZN3A_2C5Ev]+0x1b): undefined reference to
vtable for A_2' collect2: error: ld returned 1 exit status

如果 main.cpp 写成这样,你的编译指令就会起作用:

#include "A_2.h"
#include "B_1.h"
int main()
{
A_1 *ptr = new A_2;
B_1 b1("name");
}

libA 将被加载以解析 main 中的符号,而这些符号将用于 libB 的缺失符号。

for more information : there is a nice article on the linux journal which goes deeper on the symbol resolution

关于c++ - 奇怪的 undefined reference `vtable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56148734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com