Символ Dyld не найден - PullRequest
       4

Символ Dyld не найден

2 голосов
/ 16 сентября 2010

Вот моя ошибка.

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 просто дает мне материал для сторонних фреймворков, не включенных, но это мой основной namespace !!Ауг!


[РЕДАКТИРОВАТЬ] Поскольку @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) ???

1 Ответ

1 голос
/ 17 сентября 2010

Исходя из нашего обсуждения вашего вопроса, я уверен, что это как-то связано с тем фактом, что все ваши методы определены в определении класса. Это означает, что у gcc нет функции «key», наряду с которой он может выдавать символ для объекта typeinfo, т.е. нет единого объектного файла, в который можно поместить объект typeinfo. Поэтому gcc делает так, чтобы выдавать символ typeinfo в каждый объект файл, который требует этого и сообщает компоновщику, чтобы он игнорировал дубликаты при создании dylib.

Причина, по которой я спросил об атрибутах видимости, заключается в том, что если хотя бы один из дублированных символов помечен как «скрытый», то компоновщик будет скрывать символ typeinfo внутри dylib, и любая другая часть вашего приложения не сможет его найти. во время выполнения. Вы не получите ошибку времени компиляции, которая, кажется, соответствует поведению, о котором вы сообщаете.

Если вы не уверены, используете ли вы атрибуты видимости, то, скорее всего, нет, поскольку видимость по умолчанию - «по умолчанию», что в основном означает не скрытый. Найдите параметры для gcc, которые начинаются с -fvisibility в ваших файлах сборки. Видимость также может быть отмечена в коде с помощью таких вещей, как __attribute__ ((visibility ("hidden"))).

Причина, по которой я предложил переместить хотя бы одно определение элемента в файл cpp, заключалась в том, чтобы принудительно вызвать один выброс объекта typeinfo и проверить, имеет ли это значение. Вы не сказали, пробовали ли вы это или нет, поэтому было бы полезно узнать.

...