OS X: Любой способ ЗАДЕРЖАТЬ загрузку ЗАВИСИМОЙ библиотеки (.dylib)?

Зависимая библиотека C++ .dylib находится в пакете, расположенном в Content/Frameworks пакета приложения. Я хотел бы ЗАДЕРЖАТЬ загрузку этой зависимой библиотеки, пока я не завершу какую-то конкретную инициализацию.

Есть ли способ, КРОМЕ создания библиотеки, загружаемой во время выполнения? Будет ли использование опций слабого связывания препятствовать загрузке .dylib до первого обращения?


person SMGreenfield    schedule 12.05.2016    source источник


Ответы (1)


Вы имеете в виду ленивое связывание:

ld -o test test.o -lazy_library /usr/lib/libz.dylib
ld -o test test.o -lazy-lz

Оба загружают библиотеку сжатия Zlib при первом запуске подпрограммы из нее. Проблема не в том, чтобы запускать подпрограммы из пользовательской библиотеки до завершения инициализации.

Слабое связывание означает, что «если библиотека отсутствует, установите все ее символы в NULL, не останавливайтесь».

ВНИМАНИЕ: замените Zlib (/usr/lib/libz.dylib) своей библиотекой.

person Top Sekret    schedule 12.05.2016
comment
Очень крутой трюк! Я получил эту ошибку: ld: недопустимая ссылка данных на __ZN9WBRefSpecD1Ev в лениво загруженной dylib Где искаженный символ ссылается на деструктор класса: _WBRefSpec::~WBRefSpec() Что вызывает это? - person SMGreenfield; 13.05.2016
comment
Я НЕ ЗНАЮ. Может быть, некоторые символы НЕ могут быть слабыми? - person Top Sekret; 13.05.2016
comment
Как вы заметили, дело не в СЛАБЫХ, а в ЛЕНИВЫХ. В любом случае - похоже, НИКТО не знает ответа на ошибку с недопустимой ссылкой на данные, поэтому мне придется обратиться в службу поддержки разработчиков Apple... - person SMGreenfield; 14.05.2016
comment
ПРИМЕЧАНИЕ. Ответ на недопустимую ссылку на данные заключался в том, что существует файл .cpp с функцией-членом класса, которая объявляет static WBRefSpec foo; Удалил это, и бинго, нет ошибки ссылки. - person SMGreenfield; 14.05.2016