Я понял это. Файл Excel не был успешно создан до отправки письма. Так что переместил почтовый код из функции в новую функцию и работал нормально ...
Я нашел ответ сам.
я должен был добавить --export-dynamic
флаги к опциям ссылки для основного исполняемого файла.
При создании динамично связанного исполняемого файла, добавьте все символы к динамической таблице символов. Динамическая таблица символов является набором символов, которые видимы от динамических объектов во время выполнения.
, Если Вы не используете эту опцию, динамическая таблица символов будет обычно содержать только те символы, на которые ссылается некоторый динамический объект, упомянутый в ссылке.
при использовании "dlopen" для загрузки динамического объекта, который должен вернуться к символам, определенным программой, а не некоторым другим динамическим объектом, затем необходимо будет, вероятно, использовать эту опцию при соединении самой программы.
Правильное решение состоит в том, чтобы добавить -rdynamic
к команде ссылки основного исполняемого файла. Это добавит подходящий вариант к ld
(который, при использовании GNU ld
, оказывается, --export-dynamic
).
Добавление --export-dynamic
непосредственно является технически неправильным: это - опция компоновщика и так должно быть добавлено как -Wl,--export-dynamic
, или -Wl,-E
. Это также менее портативно, чем -rdynamic
(у других компоновщиков есть эквивалент, но сама опция отличается).
Когда я столкнулся с той же проблемой, я просто использовал следующее решение. Перед загрузкой любого плагина просто загрузите саму программу, перенеся ее символы в динамические таблицы:
dlopen(NULL,RTLD_NOW|RTLD_GLOBAL);
Я думаю, что решение лучше. Причина в том, что он также решает ту же проблему, если вы
a) ваша программа (или сторонний модуль) связана (не во время выполнения) с разделяемой библиотекой, символы которой должны быть в динамической таблице;
б) невозможно перекомпилировать этот модуль с флагом -rdynamic.