代码之家  ›  专栏  ›  技术社区  ›  Stephen Furlani

未找到Dyld符号错误

  •  2
  • Stephen Furlani  · 技术社区  · 14 年前

    这是我的错误。

    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 是我的主命名空间。我刚才有两个类似的问题( one two )但这两种解决方案都不能帮助我。

    我在更新了Mac之后注意到了这个问题,但我认为这是无关的。

    未生成编译错误(或警告)。

    什么会导致这种情况?为什么编译器在链接期间没有捕捉到任何东西?我已经完成了干净的构建,重置了xcode和mac……我只是处于智囊团的末端,谷歌给了我一些第三方框架的东西,但这是我的主要内容。 namespace !啊!


    [编辑] 因为@troubador指出 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++定义的所有虚拟的OK(与Java或Objc相反)????

    1 回复  |  直到 14 年前
        1
  •  1
  •   Troubadour    14 年前

    基于我们对您的问题的讨论,我确信这与您的所有方法都是在类定义中定义的这一事实有关。这意味着gcc没有“key”功能,除了这个功能外,它还可以发出typeinfo对象的符号,也就是说,没有可以放置typeinfo对象的单个对象文件。因此,gcc所做的就是将typeinfo符号发送到每个需要它的对象文件中,并通知链接器在创建dylib时忽略重复项。

    我询问可见性属性的原因是,即使其中一个重复的符号标记为“hidden”,链接器也会将typeinfo符号隐藏在dylib中,并且应用程序的任何其他部分在运行时都无法查找到它。您将不会得到一个编译时错误,它似乎适合您报告的行为。

    如果您不确定是否使用可见性属性,那么您可能不使用,因为默认可见性是“默认”的,这基本上意味着不隐藏。寻找GCC的选项 -fvisibility 在生成文件中。可视性也可以用诸如 __attribute__ ((visibility ("hidden"))) .

    我建议在cpp文件中移动至少一个成员定义的原因是为了强制执行typeinfo对象的单个发射,并测试这是否会产生影响。你没有说你是否试过这个,所以最好知道。

    推荐文章