我做了一個自定義的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。
嗯,你可以發佈一個示例項目嗎?很難說沒有更多的代碼。 –
我還沒有能夠通過重寫所有相關部分來重現較小/示例項目中的錯誤,所以我猜錯誤可能是由於項目的複雜性質而發生的。這是太多的代碼來發布它,雖然在目前的形式。有沒有其他方法可以驗證鏈接器爲什麼會這樣?就好像鏈接器只會根據它們的名稱「看到」某些方法實現(而不是其他方法)。奇怪,我想。 – Jonas
是的,它看起來像重新實現(runX)方法的方法使鏈接器看到基類中的實現。否則,實施失蹤。我想知道它是否無法找到它的B/C的實施是在一個框架。也許添加一個靜態庫,而不是你的目標,並在你的應用程序中使用它? –