Позвольте мне объяснить сценарий. У нас есть устаревшая C++ скомпилированная .so библиотека. Функции в этой библиотеке объявляются с помощью extern "c" {}
, поэтому библиотека может использоваться как с программой C, так и с C++, плюс по какой-то причине она была создана с опцией --static-libgcc
.Как написать библиотеку C .so для замены существующей библиотеки C++ .so?
Эта старая библиотека очень старая и трудноподдерживаемая. Теперь нам удалось написать его, но на языке C. Скажем, старая библиотека называется libfoo.so (old), а новая - libfoo.so (new). Для данного bar.o он может быть связан либо с старым, либо с новым libfoo.so, чтобы создать исполняемый файл, скажем, bar.exe. Но bar.exe может работать только с той же самой библиотекой, что и раньше, другими словами, эти две библиотеки не взаимообменяемы.
EDIT # 1: Я сделал символическую ссылку с именем libfoo.so, чтобы указать на libfoo.so (старый) или libfoo.so (новый). Эта символическая ссылка libfoo.so находится в LD_LIBRARY_PATH во время выполнения.
EDIT # 2: Когда я связался bar.o со старым libfoo.so и генерируемой bar.exe, если я запускаю этот bar.exe с новым libfoo.so, она сообщила об ошибке в undefined symbols
. К nm
эти два libfoo.so, я могу узнать эти символы в старом, но не в новом. Символы - это что-то вроде _ZSt4cerr
, который является измененным именем C++ lib (хотя он был внесен --static-libgcc
), и, конечно, новый libfoo.so не содержит эти символы.
EDIT # 3: Если я просто скомпилирую и свяжу код C с g ++ вместо gcc, это имеет смысл?
Как это реализовать?
EDIT # 4: Сегодня мне удалось скомпилировать/связать новый C программированного libfoo с г ++ (со статическим libgcc, статические libstdC++), это может привести ко всем символам C++, которые должны содержаться в libfoo.so. Это может заставить все работать гладко, но не то, что я действительно хочу.
Почему это не работает с новой библиотекой? Какое сообщение об ошибке вы получаете? –
Он не получает сообщение об ошибке. Он фиксирует то, что не сломано, просто громко хлопает в ладоши. –
Пожалуйста, обратитесь к РЕДАКЦИИ № 2, я обновил свой вопрос. Благодаря! – solotim