![](/img/trans.png)
[英]Handling “dyld: lazy symbol binding failed: Symbol not found” error when compiling C++ code on Mac
[英]Dyld Symbol not Found Error
這是我的錯誤。
dyld: Symbol not found: __ZTIN8eqOsirix3ROIE
Referenced from: /Users/slate/Documents/osirixplugins/CoreDataTrial_EQOsirix/build/Development/rcOsirix.app/Contents/MacOS/rcOsirix
Expected in: flat namespace
in /Users/slate/Documents/osirixplugins/CoreDataTrial_EQOsirix/build/Development/rcOsirix.app/Contents/MacOS/rcOsirix
Data Formatters temporarily unavailable, will re-try after a 'continue'. (Not safe to call dlopen at this time.)
(gdb) bt
#0 0x8fe01065 in __dyld_dyld_fatal_error ()
#1 0x8fe04fa5 in __dyld__ZN4dyld4haltEPKc ()
#2 0x8fe0796b in __dyld__ZN4dyld5_mainEPK12macho_headermiPPKcS5_S5_ ()
#3 0x8fe018b1 in __dyld__ZN13dyldbootstrap5startEPK12macho_headeriPPKcl ()
#4 0x8fe01057 in __dyld__dyld_start ()
(gdb) continue
Program received signal: “EXC_BAD_ACCESS”.
Data Formatters temporarily unavailable, will re-try after a 'continue'. (Not safe to call dlopen at this time.)
(gdb) bt
#0 0x8fe010e3 in __dyld__ZN13dyldbootstrapL30randomizeExecutableLoadAddressEPK12macho_headerPPKcPm ()
#1 0x8fe04fa5 in __dyld__ZN4dyld4haltEPKc ()
#2 0x8fe0796b in __dyld__ZN4dyld5_mainEPK12macho_headermiPPKcS5_S5_ ()
#3 0x8fe018b1 in __dyld__ZN13dyldbootstrap5startEPK12macho_headeriPPKcl ()
#4 0x8fe01057 in __dyld__dyld_start ()
(gdb)
其中eqOsirix
是我的主要名稱空間。 不久前我遇到了兩個類似的問題( 一個和兩個 ),但是現在都沒有解決方案對我有幫助。
更新Mac之后,我注意到了這個問題,但我認為這無關緊要。
不會產生編譯錯誤(或警告)。
是什么原因造成的? 為什么編譯器在鏈接期間沒有捕獲任何內容? 我已經完成了干凈的構建,同時重置了XCode和Mac。...我只是機智的結束,而Google只是為我提供了不包含第3方框架的內容,但這是我的主要namespace
! Augh!
[編輯]由於@Troubador指出ROI
並不是爭奪戰的一部分,因此我將ROI包括在下面:
#ifndef EQOSIRIX_ROI_H
#define EQOSIRIX_ROI_H
namespace eqOsirix{
class ROI : public eq::Object
{
public:
ROI() {};
virtual ~ROI() {};
virtual uint32_t getType() {return NONE;};
virtual void draw() {};
protected:
enum ROIType {
NONE = 0,
LINE,
POLY,
AREA,
VOLUME
};
private:
};
}
#endif//EQOSIRIX_ROI_H
沒有太多的事情要解決,我想我已經為C ++(而不是Java或ObjC)定義了所有虛擬函數?
根據我們對您的問題的討論,我確定這與您的所有方法都在類定義中定義有關。 這意味着gcc沒有“鍵”功能,它可以為typeinfo對象發出符號,即沒有可以放置typeinfo對象的單個對象文件。gcc因此要做的是向每個對象發出typeinfo符號。需要它的文件,並在創建dylib時通知鏈接程序忽略重復項。
我詢問可見性屬性的原因是,即使將重復的符號之一標記為“隱藏”,鏈接器也將在dylib中隱藏typeinfo符號,而應用程序的任何其他部分在運行時都無法對其進行查找-時間。 您不會收到似乎與您報告的行為相符的編譯時錯誤。
如果您不確定是否使用可見性屬性,則可能不是,因為默認可見性是“默認”,這基本上意味着沒有隱藏。 在構建文件中尋找啟動-fvisibility
gcc選項。 也可以使用諸如__attribute__ ((visibility ("hidden")))
類的代碼在代碼中標記__attribute__ ((visibility ("hidden")))
。
我建議在cpp文件中移動至少一個成員定義的原因是強制一次發出typeinfo對象並測試這是否有所不同。 您沒有說自己是否嘗試過,所以很高興知道。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.