我有一个基于SCons的分层构建系统。我有一个根SConstruct,它调用一个SConscript来构建一个共享库,然后调用另一个SConscript来构建依赖于该共享库的可执行文件。
那么这里是我的问题:在Linux上,我对共享库的理解是,在您想要对将使用共享库的可执行文件进行最终的
这里是我的SCons文件的样子:
=== rootdir / SConstruct
所以这里的问题在于这行代码:
有没有更符合SCons的方法来完成这个任务?
那么这里是我的问题:在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
本身:
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的方法来完成这个任务?