我有一个基于 SCons 的分层构建系统。我有一个根 SConstruct,它调用一个构建共享库的 SConscript,然后调用另一个构建依赖于共享库的可执行文件的 SConscript。
所以这是我的问题:我对linux上共享库的理解是,当你想做最后的事情时ld
将使用共享库的可执行文件的链接,共享库必须包含在可执行文件的ld
命令行作为引用它的源(除非它位于标准位置,在这种情况下-l
选项有效)。
我的 SCons 文件如下所示:
=== rootdir/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
itself:
gcc -g -Wall -Werror -o libfoo.so foo.o morefoo.o libfoo.so
那么如何使用 SCons 最好地实现这一点呢?现在我已经采用了这个技巧:
=== rootdir/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 的方式来做到这一点?