C ++: как ссылаться на libA.so, а не на libA-X.Y.Z.so - PullRequest
2 голосов
/ 31 октября 2008

У меня есть библиотека А, которую я разрабатываю. Когда я развертываю его на машине, соответствующие libA.so и libA-X.Y.Z.so помещаются в / usr / lib (X.Y.Z - номер версии).

Сейчас я разрабатываю библиотеку B, в которой используется A. Когда я связываю B, я использую флаг -lA. Тогда " ldd libB.so " дает мне:

(...)
libA-X.Y.Z.so => /usr/lib/libA-X.Y.Z.so
(...)

Моя проблема в том, что когда я выпускаю новую версию A (XYZZ), мне также приходится выпускать новую версию B. В противном случае кто-то, устанавливающий последнюю версию A, не сможет установить B, который будет искать для версии XYZ, которая не существует.

Как мне решить эту проблему? Как я могу сказать B искать libA.so, а не libA-X.Y.Z.so? Или это неправильно? даже небезопасно?

Обновление 1 : библиотека A (которую я унаследовал от кого-то другого) использует автоинструменты.

Обновление 2 : когда я собираю библиотеку A, я вижу: "- Wl, -soname -Wl, libA-0.6.1.so" . Если я правильно понимаю, это означает, что мы заставляем soname быть libA-0.6.1.so . Это правильно ? Теперь моя проблема в том, что я понятия не имею, как изменить это поведение в проекте, который использует автоинструменты. Некоторое время я гуглил, но не могу найти никакой полезной информации. Должен ли я изменить файл configure.in или Makefile.am?

Ответы [ 3 ]

5 голосов
/ 31 октября 2008

Когда вы создаете libA.so, передайте опцию -soname компоновщику (если вы связываетесь через gcc, используйте -Wl, -soname). Затем, когда B становится связанным, компоновщик ссылается на A через свое имя, а не через имя файла. В целевой системе убедитесь, что у вас есть ссылка из soname на реальный файл. См

http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/shared-libraries.html

0 голосов
/ 31 октября 2008

Ответ на мое второе обновление: В Makefile.am библиотеки libA я изменил _la_LDFLAGS с -релиз до -avoid-version . Это создало общую библиотеку без номера версии, а затем я перекомпилировал libB, которая успешно соединилась с этой неверсионной общей библиотекой.

0 голосов
/ 31 октября 2008

Это также работает в Windows как "DLL ад":).

Если B нужна конкретная версия A, и вы бы связались с libA, а не с libA-X.Y.Z, то только замена libA более новой версией может привести к тому, что B не загрузится или произойдет сбой.

Но, конечно, вы можете создать символическую ссылку из libA-X.Y.Z на libA-X1.Y1.Z1. Если API не изменились и только реализации, то вы должны быть в безопасности.

...