2013-08-22 98 views
0

我做了一個自定義的C++框架我想一個C中使用++使用的Xcode 4,但是應用程序開發,我最近遇到了一些麻煩:我獲得三個鏈接器的錯誤,我無法解決,這樣的:的Xcode定製的框架奇怪部分鏈接錯誤

Undefined symbols for architecture x86_64: 
    "non-virtual thunk to netlib::base::BaseSocket::run()", referenced from: 
    vtable for NetworkClient in network_client.o 

我有這個類,NetworkThread,在架構聲明,其中有一個抽象方法的run()。框架內的另一個類BaseSocket從NetworkThread繼承並實現此方法。第三個類NetworkClient是在使用框架的應用程序中創建的,而不是在框架本身中創建的,並且繼承自BaseSocket類,但編譯它會觸發上述鏈接器錯誤。我只知道如何解決鏈接器錯誤,但現在到了這個奇怪的部分:我只在類BaseSocket的實現部分獲得鏈接器錯誤 - 一些方法工作正常(甚至是新的我添加證明框架及其路徑設置正確)。我找到了解決鏈接器錯誤的解決方法。這是首部聲明(中BaseSocket)外觀時出現錯誤,如:

void run() override; // Will cause linker error 

當我改變這樣的標題(和重新的名字在實施中RUNX以及方法),它工作正常:

void run() override { this->runX(); } 
void runX(); // Works like a charm! 

我已經刪除了派生數據文件夾,清理了項目並刪除了與項目一起放置的構建文件夾。

有什麼建議嗎?

在此先感謝!

更新:總結一下這個問題,你可能會說當鏈接器被命名爲「run」時鏈接器不能「看到」實現 - 當它被稱爲別的東西時(比如runX()), ,所以如果我在頭文件(.h)文件中執行run(),然後調用解決問題的方法runX(在cpp文件中實現)。這看起來像是一個編譯器和/或鏈接器的bug。

+0

嗯,你可以發佈一個示例項目嗎?很難說沒有更多的代碼。 –

+0

我還沒有能夠通過重寫所有相關部分來重現較小/示例項目中的錯誤,所以我猜錯誤可能是由於項目的複雜性質而發生的。這是太多的代碼來發布它,雖然在目前的形式。有沒有其他方法可以驗證鏈接器爲什麼會這樣?就好像鏈接器只會根據它們的名稱「看到」某些方法實現(而不是其他方法)。奇怪,我想。 – Jonas

+0

是的,它看起來像重新實現(runX)方法的方法使鏈接器看到基類中的實現。否則,實施失蹤。我想知道它是否無法找到它的B/C的實施是在一個框架。也許添加一個靜態庫,而不是你的目標,並在你的應用程序中使用它? –

回答

0

下面是關於正在發生的事情與虛函數表,虛函數和繼承一個偉大的職位:

http://arsenmk.blogspot.com/2013/02/a-little-more-about-virtual-functions.html

此外,您還可以看到鏈接程序將與「otool」和「納米」是什麼AT命令命令行。如:

$ nm /path/to/your.o 

它將輸出的符號列表,其中「U」代表和未定義的符號,是這樣的:選項

000000000000001b T foo 
0000000000000000 T main 
       U printf 

這裏的都是一些不錯的跑下來和輸出的nm命令:

http://pic.dhe.ibm.com/infocenter/aix/v7r1/index.jsp?topic=%2Fcom.ibm.aix.cmds%2Fdoc%2Faixcmds4%2Fnm.htm

What does "symbol value" from nm command mean?