2017-08-07 16 views
0

automakeの下で、私は静的に私のライブラリとリンクし実行ファイルで使用するサードパーティの静的ライブラリと私はそれの上に構築しています静的ライブラリ、持っている:静的ライブラリが含まれていますが、シンボル未解決

libthird.a, libmy.a, progs... 

私は(Makefile.am)とlibmy.aをコンパイルしています:私はlibmy関数を呼び出すPROGをコンパイルしてリンクすると

noinst_LIBRARIES = libmy.a 
...sources... 
libmy_a_LIBADD = libthird.a 

、それはlibmyが使用するすべてのlibthirdシンボルに未解決のエラーを与え、リンクを拒否します。試してみるよう

、私は

libmy_a_LIBADD = $(LIB_THIRD_OBJS) 

libthird.aを構築し、それが動作しているから、つまり、明示的にオブジェクトファイルと

​​

を置き換えます。最初のケースで何が間違っていますか? libmy.aが最初のケースでlibthird.aが含まれ、

別の試行として、私はar libmy.aに走った、libmyA.aを生成するために、libthird.aそれを供給する(すなわちless libmy.aショーは、ファイルやlibthird.aオブジェクト) libmyA.aにリンクされているプログラムは、libthirdシンボルを適切に解決します。

また、私はここで説明したように、それは可能ではありませんか:Embed all external references when creating a static library

答えて

0

なぜ:

prog_LDADD = libmy.a libthird.a 

あなたも省く必要があります。この場合は

​​

libmy.aは、静的な便利なライブラリですので、さらにそれをリンクするための本当のポイントはありませんので。

+0

ありがとうございました。私の質問はうまくいっていませんでした。私は自分が行っていることをよりよく反映するように編集しました。あなたが言うことは、もともと私が記述したケースではうまくいくでしょうが、libmy.aにlibthirdシンボルを含める必要があります。私が記述したmakefileの外でそれに対してプログラムをリンクするつもりです。 – user907323

+0

それから 'libmy.a'はおそらく便利なライブラリであってはなりません。 「私はlibmy.aにlibdirdのシンボルを含める必要があります。私が記述したmakefileの外でプログラムをリンクさせるためです。あなたのライブラリにlibthirdシンボルを持たないなら、それを防ぐことはできません。それらは単に 'libmy.a'と' libthird.a'をリンクします。静的なライブラリを1つのライブラリに結合して、リンクすることができます(あなたが言ったように)[this](https://stackoverflow.com/a/23432530/425738)のようなものです。これは、静的ライブラリを使用した場合の基本的な選択です。 – ldav1s

+0

ありがとう、後者は私が探しているものです。実行ファイルを 'libmy.a'と' libthird.a 'の両方にリンクする場合、 'libmy.a'は' libthird.a'の低レベル実装の上の抽象であるので、これは避けたいものです。 – user907323

関連する問題