2011-02-07 13 views
4

私はライブラリlibmya.soとライブラリlibmyb.soを持っています。 libmyb.soの関数は、libmya.soの関数に依存します。また、私はlibmyb.soに依存する実行可能なmyexeを持っています。これらのライブラリを作るときに、ルールに-lオプションを付けるべきですか?リンクするときにライブラリの依存関係はどのように機能するのですか?

それは1)であるべき:

libmya.so: $(OBJ_FILES) 
    $(CPP) $(LDFLAGS) -o [email protected] $^ 

libmyb.so: $(OBJ_FILES) 
    $(CPP) $(LDFLAGS) $(LIBS) -o [email protected] $^ -lmya 

myexe: $(OBJ_FILES) 
    $(CPP) $(LDFLAGS) $(LIBS) -o [email protected] $^ -lmyb 

または2)

libmya.so: $(OBJ_FILES) 
    $(CPP) $(LDFLAGS) -o [email protected] $^ 

libmyb.so: $(OBJ_FILES) 
    $(CPP) $(LDFLAGS) $(LIBS) -o [email protected] $^ 

myexe: $(OBJ_FILES) 
    $(CPP) $(LDFLAGS) $(LIBS) -o [email protected] $^ -lmya -lmyb 

またはいくつかの他のコンボ?

+1

なぜCPPを使用していますか?それは従来のCプリプロセッサです。 CXXは従来からC++コンパイラです。 –

+0

@Fred Nurk:私がここに来たときのようでした!先端に感謝します。 – MattSmith

+0

あなたはどのオペレーティングシステムを使用していますか?あなたがファイルを扱っているので、私はUnixを想定していますが、明確にすることは害ではありません。 – mgiuca

答えて

1

私はオプション1(オプション2は動作しますが、それ以来、誰もがexeをリンクする誰もが必要とするすべての推移的ライブラリを覚えておく必要があります)は行っていません。

ただし、このアドバイスは上記のようにsoファイルを作成するためのものです。 soファイル(共有オブジェクト)は、実行可能ファイルによく似た、 "main"ライブラリを持たない "インテリジェントな"ライブラリです。 soファイルは他のライブラリ(実行可能ファイルなど)にリンクでき、実行可能ファイルがsoファイルにリンクすると、soファイルの依存関係が自動的に再帰的に含まれます。

したがって、作成するsoファイルは、すべての依存関係とリンクする必要があります。

aファイル(静的ライブラリ)などの「ダム」ライブラリは別の話です。実行可能ファイル内のすべてのリンクを行う必要があります(オプション2)。

lddツールを使用して、実行可能ファイルとsoファイルの依存関係を調べて、この動作の仕組みを確認することをお勧めします。

オプション1がより良い理由の実際の例については、ldd /usr/lib/libpng.soを試してください。 libpngはlibzにリンクされています。そうでなければ、libpngとリンクする人は誰でもlibzとリンクする必要があります。それは、libzが関係していることを知らずにlibpngとリンクすることができます。

0

ライブラリは、それらをビルドするときに互いに依存しません。実行可能ファイル(exeまたはdll)は、それらに依存します。ライブラリは、関数やデータの集合です。彼らはリンク時(どこからでも重要ではない)でその内容がexe/dllによって使用されるときにそこにいなければなりません。ライブラリはリンクされておらず(ビルド時に)、それらを構成するオブジェクトファイルは図書館員によってアーカイブされます。

あるライブラリの関数は別のライブラリの関数を使用できますが、exe/dllのリンク時にのみ、これらの依存関係が解決されます(つまり、両方のライブラリがリンクされている必要があります)。

+1

言い換えれば、これは、オプション2がうまく動作すると言うことについての包括的な方法です。 – Mac

+0

私の答えを見てください。いずれのオプションも機能しますが、オプション1がはるかに優れています。あなたは正しくありません(少なくともUnixでは 'so'ファイルが存在するので、おそらくUnixについての質問です)、ライブラリはリンクされておらず、単にオブジェクトの「ダム」なコレクションに過ぎません。これは 'a'ファイルには当てはまりますが' so'ファイルには当てはまりません。ライブラリは、依存関係とリンクすることができます(またリンクする必要があります)。 – mgiuca

+0

@mgiuca:ypuを読むことはできませんか?私は明らかにライブラリとdllを区別して区別します。あなたの情報のためにdllはリンクされなければならないため実行可能なコードです。ライブラリは単に関数とコードを含むオブジェクトファイルの集合です。 –

関連する問題