我有一个基于 SCons 的分层构建系统。我有一个根 SConstruct,它调用一个构建共享库的 SConscript,然后调用另一个构建依赖于共享库的可执行文件的 SConscript。
所以这是我的问题:我对 linux 上的共享库的理解是,当您想要为ld
将使用共享库的可执行文件进行最终链接时,必须将共享库ld
作为参考源包含在可执行文件的命令行中它(除非它位于标准位置,在这种情况下该-l
选项有效)。
所以这里是我的 SCons 文件的样子:
=== 根目录/SConstruct
env=DefaultEnvironment()
shared_lib = SConscript('foolib/SConscript')
env.Append( LIBS=[shared_lib] )
executable = SConscript('barexec/SConscript')
=== rootdir/foolib/SConscript
env=DefaultEnvironment()
env.Append(CPPPATH=Glob('inc'))
penv = env.Clone()
penv.Append(CPPPATH=Glob('internal/inc'))
lib = penv.SharedLibrary( 'foo', source=['foo.c', 'morefoo.c']
Return("lib")
=== rootdir/barexec/SConscript
env=DefaultEnvironment()
exe = env.Program( 'bar', source=['main.c', 'bar.c', 'rod.c'] )
Return("exe")
所以这里的障碍是这一行:
env.Append( LIBS=[shared_lib] )
这是将生成的库添加到需要它们的任何其他库的命令行的好方法,除了因为 SCons 正在通过 SConscripts 进行两次运行(首先生成它的依赖关系树,然后进行工作) ,rootdir/foolib/libfoo.so
在所有产品的命令行上结束,甚至libfoo.so
它本身:
gcc -g -Wall -Werror -o libfoo.so foo.o morefoo.o libfoo.so
那么如何最好地使用 SCons 呢?现在我已经求助于这个黑客:
=== 根目录/SConstruct
env=DefaultEnvironment()
shared_lib = SConscript('foolib/SConscript')
env['shared_lib'] = shared_lib
executable = SConscript('barexec/SConscript')
...
=== rootdir/barexec/SConscript
env=DefaultEnvironment()
exe = env.Program( 'bar', source=['main.c', 'bar.c', 'rod.c'] + env['shared_lib'] )
Return("exe")
有没有更多的 SCons-y 方式来做到这一点?