Я создал общую библиотеку (.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 ++, эта проблема видна.
Я уже проверил и подтвердил следующие вещи
Любая идея, как я могу решить это? И в чем может быть проблема.
Если нет, то как я могу продолжить расследование.
Пожалуйста, дайте мне знать, если потребуется дополнительная информация.
С уважением,
павана
Странная проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь использовать функции 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)
?
Если последнее, это мертвая распродажа, что какой-то объект ссылается искромсанный название.
Других решений пока нет …