3

プリコンパイル済み (静的) ライブラリをリンクするように bazel に指示するにはどうすればよいですか?

既存のスタティック ライブラリ プロジェクト (xy.BUILD) を参照しました。

cc_library(
  name="xy",
  srcs=["lib/x86_64/libxy.a"],
    hdrs=["include/xy.h"],
  includes=["include"],
  #linkstatic=True,                          <---- *1
  #alwayslink=True,
  visibility=["//visibility:public"],
)

別のプロジェクト内 (BUILD):

cc_library(
  name="myxylib",
  hdrs=["myxylib.h"],
  srcs=["myxylib.c"], 
  visibility=["//visibility:public"],
  deps=["@xy//:xy"],
  linkopts = ["-pthread", 
            #"-Lexternal/xy/lib/x86_64/",    <---- *2
            #"-lxy", 
            #"-z defs"
  ],

)

... 外部依存関係として (WORKSPACE の new_local_repository)。ヘッダー ファイルを使用してコードを .so ライブラリとしてコンパイルすることはできますが、静的ライブラリのシンボルが共有オブジェクト内にありません。依存。bazel がこれを自動的に行うようにする方法はありますか? コメント *1 のパラメーターは既に試しましたが、役に立ちません。

-L フラグと -l フラグを手動で設定することに非常に違和感を覚えます。これは、異なるアーキテクチャをサポートする必要があり、アーキテクチャに依存する異なるライブラリのパスを、継承されたアーティファクトごとに繰り返すのではなく、1 つだけ設定することを好むためです。

4

3 に答える 3

4

変更された linkopts (-shared) および name(" lib myxylib .so ")で cc_library の代わりに cc_binary を使用する:

cc_binary(
  name="libmyxy.so",
  hdrs=["myxylib.h"],
  srcs=["myxylib.c"], 
  visibility=["//visibility:public"],
  deps=["@xy//:xy"],
  linkopts = ["-shared"],
)

...特定の制御なしですべてをバイナリにリンクすることに満足している限り、回避策として役立つようです。これには、clib バージョンのバインドも含まれます。

于 2015-10-05T06:56:01.930 に答える
3

cc_libraryは、 に結合されるまで依存関係にリンクしません(指定しなくても cc_binary、すべてが にリンクされます)。cc_binary

すべてを にリンクさせるエレガントな方法はありませんcc_library$locationでagenruleを使用できるため、特定のアーキテクチャを指定する必要はありません。または、追加してほしい機能がある場合は、お気軽に機能リクエストを提出してください。

于 2015-10-01T14:33:59.037 に答える
1

Like Jan mentions, you can use cc_binary() to create a library. You should use the linkshared=1 attribute so Bazel issues the right flags for generating a DSO.

于 2015-10-06T10:36:13.557 に答える