6

我正在使用 scons 实用程序来生成共享库。当我编写以下规则时:

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

我会得到“libhello.so”文件。

有没有办法自动获取像“libhello.so.version”这样的文件?

4

3 回答 3

8

版本化的库已经很好地集成到 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
于 2013-12-30T13:41:30.080 回答
3

您可能希望使用libtool来处理共享库的创建和版本控制。不幸的是,您必须自己将 libtool 与 SCons 集成,因为这不是软件内置的。当然,原因是 libtool 是特定于平台的。

作为一种廉价的替代方案,您可以将 env['SHLIBSUFIX'] 覆盖为:

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

然后,您可以为每个目标独立覆盖 $SHLIB_VERSION 构造变量:

SharedLibrary('hello', 'hello.c', SHLIB_VERSION = 1)
于 2010-06-09T04:40:23.240 回答
2

有一个关于 SCons 中缺乏 soname 支持的开放错误报告,以及Eric S. Raymond提出的补丁。

支持版本化共享库(soname)

此功能旨在为 Unix 下的共享库生成和安装提供更好的处理,包括正确设置 soname 和 rpath/loadpath。

Eric S. Raymond 大致基于 Richard Levitte 的作品,提供了他的代码(见附件),用于集成到 SCons 核心例程中。到目前为止,它已经在 Linux、*BSD 和 darwin 下进行了测试,并且进行了相当大的清理和调试。它已经用于 gpsd 项目的生产。

尽管如此,还是有一些工作要做。必须决定是否应通过正常SharedLibrary()调用或单独的功能(如VersionedSharedLibrary().

于 2012-08-30T16:31:29.327 回答