2017-06-23 8 views
2

私はビルドして、LCMをBazelとパッケージ化しようとしています。これは「ビルド」部分で機能しますが、最終的には外部のコンシューマーが使用できないライブラリ(パッケージが壊れているため「パッケージ」に失敗します)が発生します。なぜBazelはアンダーリンクしていて、どうすれば修正できますか?

LCMは、pkg_config_packagegory details)でインポートしているglibを使用しています。具体的には、LCMはglib を内部でと使用しますが、ユーザーには公開しません。つまり、の消費者はglibをリンクする必要はありません。 liblcm.soはこれを行う必要があり、消費者はLCM自体にリンクするだけでよい。

これはすべて上流(CMakeを使用し、正しいことをする)でうまく動作します。しかし、Bazelは、何らかの未知の理由のために、liblcm.soをglibにリンクしていないようです。私が同じ全体的な環境内でBazelで実行可能ファイルをビルドすると、BazelはLCMのユーザーもglibにリンクする必要があることを知っているようです。しかし、このLCMを外付けでパッケージ化しようとすると、liblcm.soがglibにリンクされていないため、LCMのプライベート glib依存関係に対処する必要があります。

なぜBazelはLCMライブラリをglibにリンクしていないのですか?どうすれば修正できますか?

(P.S.私たちはlibbotと同様の問題を持っている...)

答えて

0

明らかに、これは既知の問題です:https://github.com/bazelbuild/bazel/issues/492です。

cc_librarycc_binaryにすることはできません。なぜなら、アンダーリンクを修正する一方、他のBazelターゲットではライブラリを使用できないからです。また、cc_binarycc_libraryに改行することもできません。内部コンシューマと外部コンシューマが同じライブラリを使用していないためです。

+0

厳密にはそうではありませんが、hackishですが、.soをcc_library/cc_binaryのsrcsに入れても動作します(bazelにプリコンパイルされたライブラリについて知らせる現在の仕組みです)。しかしそれは表現力が十分ではないので、問題#492で言及されている「推移的図書館」を研究しています。全体として、bazelは「オープンソースの世界で発展する」ことで多くの点で改善する必要があります。 – mhlopko

-1

静的ライブラリは、他の静的ライブラリとリンクしません。 Bazelを使用してビルドする場合、Bazelは依存関係を追跡し、実行可能ファイルをビルドするときはすべての依存ライブラリとリンクします。

静的ライブラリのリンクについて、ここでより多くの情報があります:育て Linking static libraries to other static libraries

一つの興味深い提案が両方のライブラリをアーカイブ解除し、すべての.oファイルで新しいライブラリを作成しています。これは、おそらく一流で達成される可能性があります。

+0

私は*静的ライブラリを生成していません...この動作は間違っており、共有ライブラリでは壊れています。あなたは、Bazelがsojme静的ライブラリの遺産のために壊れていない共有ライブラリを生成できないと言っていますか? – Matthew

+0

既存の動作は、外部消費用の共有ライブラリを生成するためのものではありません。 TDD往復をより速くするためにそこにあります。テストを編集するときには、テストだけが再コンパイルされ、再リンクされます。依存関係は再コンパイルされません。多くの場合、すべての依存関係とテストの静的リンクは、テスト+ロードのリンクよりも時間がかかります。 – mhlopko

関連する問題