如何使用scons获取像``libhello.so.0.0.1'这样的共享库名?

Ale*_*der 6 naming-conventions shared-libraries scons

我正在使用scons实用程序生成共享库.当我写下面的规则时:

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

我会得到``libhello.so''文件.

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

vok*_*mon 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
Run Code Online (Sandbox Code Playgroud)

SCons 2.3.0仍然存在一些错误:库重建失败,因为符号链接创建依赖于os.symlink,如果链接已经存在,则会失败.这已在当前开发版本中修复.您可以通过添加以下行来修补本地2.3.0版本:

try : os.remove(whatever)
except OSError : pass
Run Code Online (Sandbox Code Playgroud)

每当在这些文件上调用os.symlink时,第二个参数都是'what':

/usr/lib/scons/SCons/Tool/install.py
/usr/lib/scons/SCons/Tool/__init__.py
Run Code Online (Sandbox Code Playgroud)


Ben*_*enG 3

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

作为一种廉价的替代方案,您可以将 env['SHLIBSUFFIX'] 重写为:

Replace(SHLIBSUFFIX = '.so.$SHLIB_VERSION')
Run Code Online (Sandbox Code Playgroud)

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

SharedLibrary('hello', 'hello.c', SHLIB_VERSION = 1)
Run Code Online (Sandbox Code Playgroud)