Проблемы со ссылками на определенные функции в моей собственной общей библиотеке в Linux

Я создал общую библиотеку (.so) в Linux, я столкнулся с очень странной проблемой.
Сначала я добавил в библиотеку 3 функции (write_myown, setfolder, register), затем добавил еще несколько (init, write_re).

По сути, вся библиотека реализована на C ++, однако API должны вызываться из исполняемых файлов на основе C и C ++. Следовательно, я использовал extern «C» для API.

Странная проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь использовать функции
write_myown, setfolder и register, связывание проходит и создается исполняемый файл.

Но когда я пытаюсь вызвать функции init или write_re, связывание завершается с неопределенной ошибкой ссылки.

Еще более странная вещь, о которой я думаю, но не уверен, — это то, что я думаю, что когда я создаю только программы на C, все работает нормально, но когда я создаю код на C ++, эта проблема видна.

Я уже проверил и подтвердил следующие вещи

  1. Библиотека (.so) существует в / usr / lib (я поместил ее туда)
  2. ldconfig -p | grep mylibname показывает, что моя библиотека присутствует.
  3. Когда я не вызываю init или write_re, исполняемый файл генерируется, и objdump / readelf показывает соответствующие ссылки.
  4. ldd на mylibrary.so показывает, что init и write_re также существуют, видимость глобальная.
  5. Созданные исполняемые файлы или .0 показывают правильную зависимость от mylibrary.
  6. Нет версий mylibrary.
  7. Я подтвердил, что он ссылается на право.
  8. В моей библиотеке показано, что все функции существуют.

Любая идея, как я могу решить это? И в чем может быть проблема.
Если нет, то как я могу продолжить расследование.
Пожалуйста, дайте мне знать, если потребуется дополнительная информация.

С уважением,
павана

0

Решение

Странная проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь использовать функции write_myown, setfolder и register, происходит связывание и создается исполняемый файл.

Но когда я пытаюсь вызвать функции init или write_re, связывание завершается с неопределенной ошибкой ссылки.

Мой хрустальный шар говорит: когда вы написали прототипы для write_myown а также setfolder в вашем .h файл, который вы добавили extern "C" им.

Но когда вы позже добавили write_reВы положили extern "C" по их определению в .cc файл, но забыли добавить его к своим прототипам в .h,

Если так,

  • функции определенный с их не искаженной формой в библиотеке, и
  • чистый C исполняемый файл может использовать их нормально, и
  • C++ объект, который ссылается на них (за пределами библиотеки) делает не увидеть extern "C" на них и так хочет их искромсанный форма (что, конечно, не предоставлено библиотекой).

Эта гипотеза, я думаю, соответствует всем фактам, которые в настоящее время находятся в вашем вопросе, и ее тривиально проверить: сообщило ли об ошибке сообщение компоновщика undefined symbol: write_reили он сказал undefined symbol: write_re(some, parameter, types) ?

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector