![](/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.