Как получить совместно используемые имена библиотек, такие как `` libhello.so.0.0.1 ''? - PullRequest
6 голосов
/ 08 июня 2010

Я использую утилиту scons для создания общих библиотек. Когда я пишу следующее правило:

SharedLibrary ('hello', 'hello.c')

Я бы получил файл `` libhello.so ''.

Есть ли способ получить файлы типа `` libhello.so.version '' автоматически?

Ответы [ 3 ]

8 голосов
/ 30 декабря 2013

Версионные библиотеки были хорошо интегрированы в SCons 2.3.0:

version = "1.2.3"

lib = env.SharedLib(target='name', sources, SHLIBVERSION=version)

# generates in linux:
# name.so -> name.so.1
# name.so.1 -> name.so.1.2.3
# name.so.1.2.3

installed = env.InstallVersionedLib(os.path.join(INSTALPREFIX,"lib"), lib, SHLIBVERSION=version)

# generates in linux if INSTALLPREFIX = /usr/local/lib and --install_sandbox=mysandbox given:
# mysandbox/usr/local/libname.so -> name.so.1
# mysandbox/usr/local/name.so.1 -> name.so.1.2.3
# mysandbox/usr/local/name.so.1.2.3

SCons 2.3.0 по-прежнему имеет некоторые ошибки: перестройка библиотеки завершается неудачно, поскольку создание символической ссылки опирается на os.symlink, которая завершается неудачно, еслиссылка уже существуетЭто уже исправлено в текущей версии разработки.Вы можете исправить вашу локальную версию 2.3.0, добавив следующие строки:

try : os.remove(whatever)
except OSError : pass

Всякий раз, когда os.symlink вызывается для этих файлов, являясь 'любым' вторым параметром:

/usr/lib/scons/SCons/Tool/install.py
/usr/lib/scons/SCons/Tool/__init__.py
3 голосов
/ 09 июня 2010

Возможно, вы захотите использовать libtool для создания общей библиотеки и контроля версий . К сожалению, вам придется самостоятельно интегрировать libtool с SCons, так как это не встроено в программное обеспечение. Конечно, причина в том, что libtool зависит от платформы.

В качестве дешевой альтернативы вы можете переопределить env ['SHLIBSUFFIX'] примерно так:

Replace(SHLIBSUFFIX = '.so.$SHLIB_VERSION')

Затем вы можете переопределить переменную конструкции $ SHLIB_VERSION независимо для цели:

SharedLibrary('hello', 'hello.c', SHLIB_VERSION = 1)
2 голосов
/ 30 августа 2012

Существует открытый отчет об ошибке об отсутствии поддержки сонама в SCons, а также предложенный патч от Эрик С. Раймонд .

Поддержка версионных общих библиотек (soname)

Эта функция направлена ​​на обеспечение лучшей обработки для генерации общей библиотеки и установка под Unixes, включая правильную настройку soname и RPATH / loadpath.

Свободно основанный на работах Ричарда Левита, Эрик С. Рэймонд предложил свою код (см. приложение) для интеграции с основными подпрограммами SCons. До сих пор был протестирован под Linux, * BSD, и Дарвин, и был значительно вычищен и отлажен. Используется в производстве для gpsd проект уже.

Тем не менее, некоторая работа должна быть сделана. Необходимо принять решение о том, функция должна быть предложена пользователю с помощью обычного вызова SharedLibrary() или отдельная функция типа VersionedSharedLibrary().

...