2016-04-25 18 views
2

私のプロジェクトには外部ライブラリの依存関係があり、ビルドにはwafスクリプトを使用しています - C、C++。WAF - スタティックライブラリを結合

静的にリンクされているすべての依存ライブラリを持つ静的ライブラリを構築しようとしています。例えば、私は、動的共有オブジェクトを構築するために、これを使用します。

bld.program(features = 'c cxx cxxshlib' 
      , target = 'program' 
      , source = sources 
      , use = libs_list) 

共有オブジェクトは、(libs_listで指定)すべての依存ライブラリがリンクされています。 ただし、静的ライブラリ:

bld.program(features = 'c cxx cxxstlib' 
      , target = 'program' 
      , cppflags = '-DSTATIC_LIB' 
      , source = sources 
      , use = libs_list) 

はありません。これを克服する方法はありますか?または、ポストビルド機能でこれを手動で行う必要がありますか?

答えて

1

waf 1.8以前では、静的ライブラリは、共有オブジェクトと同じ再帰的依存関係を共有するために使用されていました。静的なlibsの使用順序のために、私はこれが削除されたと思います。つまり、共有オブジェクトが他のライブラリに依存している場合、wafはそれらを自動的にインクルードしますが、静的ライブラリの場合は、すべてのライブラリを正しい順序でリストする必要があります。

def configure(conf): 

    # for libs that have a pkg-config 

    conf.check_cfg("expat", args = ["--libs"]) 

    # to use /some/path/libotherextlib.a or .so 

    conf.env.LIB_OEL = ['otherextlib'] 
    conf.env.LIBPATH_OEL = ["/some/path"] 

def build(bld): 

    lib_lists = ["expat", "oel"] 

    bld.shlib(target = 'myshlib', source = sources, use = libs_list) 
    bld.stlib(target = 'mystlib', source = sources, use = libs_list) 

をあなたがすることができるモジュール化するには:ここで

は「USELIBは」を使用する方法である

bld.objects(source = sources1, name = "module1") 
bld.objects(source = sources2, name = "module2") 

modules = ["module1", "module2"] 
bld.stlib(target = 'mystlib', use = modules) 
bld.shlib(target = 'myshlib', use = modules) 
+0

たものであるため、実際には、この方法では、静的libには、すべての再帰的な依存関係が含まれますキーワードの使用によって指定されます。ご覧のとおり、libs_listは両方とも同じです(私があなたを正しく理解していれば)。 しかし、この問題はexternal - libexpat.aなどのライブラリで発生します。私の場合、libexpatは-Lexpatの共有オブジェクトにリンクされますが、静的ライブラリはリンクされません。 これらの外部ライブラリをすべてarに含めたいと思います。 – Mojo28

+0

@mojo:どのコマンドが発行されたかを知るには、-hを使用します。コマンドが正常であれば、リスト内の静的ライブラリの順序が原因である可能性があります。 – neuro

+0

ええ、私は-vを使用しましたが、libsは言及されておらず、オブジェクトファイルのみが記述されています。これはおそらく予想されます。問題は、静的ライブラリをarと1つにマージするのはそれほど簡単ではないということです。デフォルトではオブジェクトファイルのみを使用しています。おそらくこれがなぜこのことが不可能なのかということです。私はまた、すべての依存静的ライブラリのリストを取得する良い方法があるかどうかはわかりません。私はarを手動で実行しようとしています。このためには、すべての依存静的ライブラリのリストが必要です。現在、STLIB_%sで始まるすべての変数を取得するために、コンテキストenvを解析しています。私はこれが最高のやり方だとは思わない。 – Mojo28

関連する問題