[英]strange undefined reference to `vtable
我整整一天都陷入了"undefined reference to vtable..."
。
實際上,我已經看到很多回答處理"undefined reference to vtable..."
例如:
https://gcc.gnu.org/faq.html#vtables
有些人的問題是忘記編寫虛函數,其他人忘記將.cpp文件添加到build目錄中。 但我想我已經注意到了。
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");
}
我使用follow命令編譯:
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鏈接器是報告未定義符號的鏈接器。 在編譯libB中的主要未解析符號時,不會通過提供libA來解析,因為main 顯式使用的所有符號都是使用libB解析的。
默認 :
后者允許你做很多靈活的事情,其中包括庫之間的循環依賴(這里libA也可以依賴於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
對於A_2'unset2的vtable的A_2::A_2()': B2.cpp:(.text._ZN3A_2C2Ev[_ZN3A_2C5Ev]+0x1b): undefined reference to
:錯誤: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以解析main中的符號,這些符號將用於libB的缺失符號。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.