簡體   English   中英

奇怪的未定義引用`vtable

[英]strange undefined reference to `vtable

我整整一天都陷入了"undefined reference to vtable..."

實際上,我已經看到很多回答處理"undefined reference to vtable..."

例如:

未定義的引用vtable“Transaction”

未定義的vtable參考

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

未定義的vtable參考

有些人的問題是忘記編寫虛函數,其他人忘記將.cpp文件添加到build目錄中。 但我想我已經注意到了。

我想做以下步驟:

  • 我想將編譯類A_1A_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_1B_2編譯到共享庫libB B_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");
}

我使用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解析的。

默認 :

  • 在編譯可執行文件時,如果存在未定義的符號,則ld會失敗
  • 在編譯庫時,如果存在未定義的符號,則ld不會失敗

后者允許你做很多靈活的事情,其中​​包括庫之間的循環依賴(這里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的缺失符號。

欲了解更多信息:linux期刊上有一篇很好的文章,它更深入地介紹了符號解析

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM