Получите “неопределенный символ” ошибка при загрузке библиотеки с dlopen

Я понял это. Файл Excel не был успешно создан до отправки письма. Так что переместил почтовый код из функции в новую функцию и работал нормально ...

20
задан Cœur 9 January 2017 в 13:33
поделиться

3 ответа

Я нашел ответ сам.

я должен был добавить --export-dynamic флаги к опциям ссылки для основного исполняемого файла.

При создании динамично связанного исполняемого файла, добавьте все символы к динамической таблице символов. Динамическая таблица символов является набором символов, которые видимы от динамических объектов во время выполнения.

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

при использовании "dlopen" для загрузки динамического объекта, который должен вернуться к символам, определенным программой, а не некоторым другим динамическим объектом, затем необходимо будет, вероятно, использовать эту опцию при соединении самой программы.

5
ответ дан 29 November 2019 в 23:48
поделиться

Правильное решение состоит в том, чтобы добавить -rdynamic к команде ссылки основного исполняемого файла. Это добавит подходящий вариант к ld (который, при использовании GNU ld, оказывается, --export-dynamic).

Добавление --export-dynamic непосредственно является технически неправильным: это - опция компоновщика и так должно быть добавлено как -Wl,--export-dynamic, или -Wl,-E. Это также менее портативно, чем -rdynamic (у других компоновщиков есть эквивалент, но сама опция отличается).

32
ответ дан 29 November 2019 в 23:48
поделиться

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

dlopen(NULL,RTLD_NOW|RTLD_GLOBAL);

Я думаю, что решение лучше. Причина в том, что он также решает ту же проблему, если вы

a) ваша программа (или сторонний модуль) связана (не во время выполнения) с разделяемой библиотекой, символы которой должны быть в динамической таблице;

б) невозможно перекомпилировать этот модуль с флагом -rdynamic.

4
ответ дан 29 November 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: