2011-01-18 2 views
0

既にコンパイルされた別のライブラリを使用するライブラリを構築できますか?リンクの問題 - ライブラリを構築して別のアーカイブを使用しようとする

通常、実行可能ファイルを作成するために使用されるいくつかのmakeファイルがあります。実行可能ファイルを作成するときは、-L ../include/lib1.aを使って元のライブラリをインクルードします。

今、私はちょうど

LIB2参照を含ん
${CPP} -c ${INC} ${CFLAGS} MyFile.cpp ${OBJ} ${LIB2} -lm 

のようなリンクで実行可能ファイルにコンパイルされたライブラリに組み込まれることはなかった実行ファイルからクラスを呼び出している別のプログラムを、構築していますto lib1.a

今すぐMyFile.cppクラスに直接アクセスしたいのですが、自分のライブラリlib2.aにビルドして新しいプログラムから呼び出そうとすると、参照するクラスがありません。これは新しいプログラムをビルドするときにlib1.aとlib2.aの両方にリンクしているにもかかわらずです。

+0

'make -n'を表示できますか?変数の置換を推測するのは難しいです。 – chrisaycock

答えて

0

はい、できます。あなたが得ている正確なエラーを見ることは役に立ちます。

ソースをライブラリにコンパイルし、コマンドラインで使用するライブラリを提供すると、コンパイラは他のライブラリを新しいものに置き換えます。そのようなことが起こった場合、あなたのライブラリや他のプログラムに対してプログラムを構築しようとすると、「二重定義されたシンボル」エラーが発生します。

+0

2つ以上のライブラリがシンボルを定義している場合、他のシンボルが他のシンボルに引っ張られない限り、そのうちの1つだけが使用されます。使用されるものは、指定された順序による最初のライブラリーのものです。上記の手法では、新しいライブラリが最初に指定されている限り、元のライブラリと一緒にエラーが生成されません。 –

1

は、必要があります。

-L../include/lib1.a 

ではない:

-L../include -llib1 

すなわち、 -Lはライブラリ検索パスを示し、-lはアーカイブ名を示します。

+0

良い点。また、バイナリライブラリファイルを "インクルード"ディレクトリに置くのはちょっと奇妙ではありませんか? –

+0

私はそれをチェックします - 私はかなりどちらかの方法で動作すると確信しています – Derek

0

lib2.aをビルドすると、lib1.aに含まれるオブジェクトファイルは含まれません。

最終的な実行ファイルは、両方でリンクされている必要があります。

関連する問題