2010-03-03 2 views
5

Позвольте мне объяснить сценарий. У нас есть устаревшая 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. Это может заставить все работать гладко, но не то, что я действительно хочу.

+0

Почему это не работает с новой библиотекой? Какое сообщение об ошибке вы получаете? –

+0

Он не получает сообщение об ошибке. Он фиксирует то, что не сломано, просто громко хлопает в ладоши. –

+0

Пожалуйста, обратитесь к РЕДАКЦИИ № 2, я обновил свой вопрос. Благодаря! – solotim

ответ

0

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

2

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

+0

Да. Если я создам и связываюсь с новой библиотекой, созданный bar.exe может работать как с старой, так и с новой библиотекой. Но почему? – solotim

+0

Это означает, что файлы заголовков новой библиотеки зависят от меньших символов, чем символы старой библиотеки. http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html может дать более подробную информацию о том, что и как из двоичных совместимых разделяемых библиотек. – Jan

1

Редактировать # 2 помогает.

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

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

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

Удачи

+0

Или, проще ответить, C .so заменить C++ .so не практично ...? :( – solotim

Смежные вопросы