SCons に基づく階層的なビルド システムがあります。共有ライブラリを構築する SConscript を呼び出してから、共有ライブラリに依存する実行可能ファイルを構築する別の SConscript を呼び出すルート SConstruct があります。
ここに私の質問があります: 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 を介して 2 パス実行を行っているため (最初に依存関係ツリーを生成し、次に作業を実行するため)、生成されたライブラリを必要とする他のライブラリのコマンド ラインに追加するための優れた方法です。 、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-y の方法はありますか?