Как записать C. так библиотека к subsitute существующему C++ .so библиотека?

Позвольте мне объяснить сценарий. У нас есть скомпилированная .so библиотека C++ прежней версии. Функции в этой библиотеке объявляются с extern "c" {}, таким образом, библиотекой можно пользоваться и C и программой C++, плюс, по некоторым причинам она была создана с--static-libgcc опция.

Эта старая библиотека очень стара и тверда поддержать. Теперь нам haved удалось записать subsitution его, но на языке C. Скажем, старую библиотеку называют libfoo.so (старый), и новый является (новым) libfoo.so. Для данного bar.o это может быть связано или со старым или с новым libfoo.so для создания исполняемого файла, скажем, bar.exe. Но bar.exe может только работать с той же .so библиотекой, которую это связало прежде другими словами, эти две библиотеки не взаимны exchangable.

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, который является скорректированным именем lib C++ (я, хотя оно было принесено --static-libgcc), и конечно новый libfoo.so не делает содержит подобные символы.

EDIT#3: Если я просто компилирую и связываю код C с g ++ вместо gcc, он имеет какой-либо смысл?

Как я должен реализовать это?

EDIT#4: Сегодня мне удалось компилировать/связывать программируемый libfoo нового C с g ++ (со статическим libgcc, статический libstdc ++), это может привести ко всем символам C++, которые будут содержаться в libfoo.so. Это может заставить все выполнить гладко, но не, что я действительно хочу.

5
задан 11 revs 5 March 2010 в 04:05
поделиться

3 ответа

дайте им одинаковые имена и поместите в разные каталоги. Используйте переменную окружения LD_LIBRARY_PATH, чтобы установить каталог с нужной библиотекой перед любыми другими каталогами.

0
ответ дан 15 December 2019 в 06:24
поделиться

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

2
ответ дан 15 December 2019 в 06:24
поделиться

Edit # 2 помогает.

Обычно ваш bar.exe пытается выполнить инициализацию среды выполнения C ++ для этой библиотеки.

Вы должны, как минимум, предоставить пустые реализации идентично измененных имен, чтобы bar.exe мог динамически искать в вашем .so и находить / вызывать их.

Если вам повезло меньше, вам может потребоваться заставить эти функции делать что-то значимое, что код верхнего уровня интерпретирует как успех.

Удачи

1
ответ дан 15 December 2019 в 06:24
поделиться