2016-05-13 3 views
1

При использовании опции ссылки «lazy linking» «-lazy-lz», указанной в this question, для задержки загрузки зависимой динамической библиотеки, компоновщика, который является частью Xcode 7.2.1 (версия LLVM версии 7.0.2 (clang-700.1 0,81)), генерирует сообщение об ошибке:Почему ленивый способ связывания вызывает ошибку «незаконного обращения к данным»?

ld: illegal data reference to __ZN9WBRefSpecD1Ev in lazy loaded dylib 

... где подогнаны C++ символ относится к классу деструктор в моем одного класса dylib: _WBRefSpec :: ~ WBRefSpec()

Я могу» t найти прямую ссылку в любом месте, чтобы указать, что может означать эта ошибка, - или что может вызвать ее.

В файле .cpp, деструктор определяется:

EXPORT WBRefSpec::~WBRefSpec(void) 
{ 
    ClearEntireRefSpec(); // commenting out this call doesn't affect error message! 
} 

... где EXPORT обычная:

#define EXPORT __attribute__((visibility("default"))) 

... и, конечно, определенный в заголовочном файле в качестве общественного члена класса:

~ WBRefSpec (void);

Кто-нибудь когда-либо видел это или знал, что вызывает эту ошибку?

EDIT/ОТВЕТ:

Ответ на нелегальные ссылки данных, что Был .cpp файл с функцией члена класса, определенной, который объявлен «статический WBRefSpec Foo;» Удалено это и бинго, нет ошибки связи.

(удаленные детали ссылки, так как они не имеют отношения к данному вопросу)

+0

опубликуйте, как вы строите/связываете свою полную программу, пожалуйста – xaxxon

+0

Возможно, для работы dylib необходимо связать нелатный указатель с другим. –

+0

@xaxxon - Установлены настройки связи (некоторые пути «санированы»). Должен ли я отформатировать его для удобства чтения? – SMGreenfield

ответ

0

Ответ на нелегальные ссылки данных, что Был .cpp файл с функцией члена класса, определенной, который объявлен «статический WBRefSpec Foo; "

WBRefSpec& XMLErrorLogFile::GetLogFileInAppFolder() 
{ 
    static WBRefSpec logFileInAppFolder; 
    return logFileInAppFolder; 
} 

В качестве теста я удалил статический и бинго, никакой ошибки связи.

Но ПРИМЕЧАНИЕ: просто редактирование «статического» в этом случае было бы очень плохой идеей и создало бы еще одну очень серьезную проблему: возвращая ссылку на объект, выделенный в стеке!

Я думаю, что если я создам элемент данных класса, который является статическим WBRefSpec *, и просто инициализируйте его в моей функции (но только один раз), тогда проблема также исчезнет.

Ирония заключается в том, что я выбираю этот шаблон, основанный на превосходном ответе SO на чужой unrelated posting.