У меня есть специализированная разделяемая библиотека, которая загружается динамически во время выполнения исполняемого файла. Эта библиотека предоставляет функцию b()
. Эта функция, в свою очередь, вызывает функцию a()
.
Функция a
определена в исполняемом файле, а не в самой библиотеке, поэтому я хотел бы иметь возможность вызывать часть моего исполняемого кода из библиотеки. Мне удалось использовать флаг -undefined dynamic_lookup
, чтобы clang оставил эти символы для ленивого связывания, но dyld все еще жалуется, когда я пытаюсь запустить исполняемый файл:
dyld: lazy symbol binding failed: Symbol not found: _a
Referenced from: /usr/local/lib/myLib.dylib
Expected in: flat namespace
Как связать этот символ?
1 ответ
Как оказалось, это было вызвано тем, что Xcode не экспортирует символ по умолчанию. Вы можете исправить это, изменив параметр «Символы, скрытые по умолчанию» в настройках сборки LLVM Code Generation. Если вы не используете Xcode, это определяет, следует ли использовать флаг -fvisiblity=hidden
в командной строке.
Кроме того, вы можете оставить этот параметр включенным и выборочно экспортировать символы, добавив атрибут __attribute__((visibility("default")))
к функциям, которые вы хотите экспортировать.
Похожие вопросы
Связанные вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.
dlopen()
исполняемый файл иdlsym()
функция? Я не думаю, что нынешний подход осуществим.dlopen
загружаю библиотеку. Моя цель - затем иметь возможность вызывать функцию, которая находится в исполняемом файле, загружающем библиотеку.dlopen()
исполняемый файл ?"