6

コンパイル時にプログラムに依存関係を理解させるのは簡単です (gcc -MM を使用)。それにもかかわらず、リンクの依存関係 (どのライブラリにリンクするかを決定すること) を把握するのは難しいようです。この問題は、リンク先の個々のライブラリを持つ複数のターゲットが必要な場合に発生します。

たとえば、3 つの動的ライブラリ ターゲット t1.so、t2.so、および t3.so をビルドする必要があります。t1.so には数学ライブラリ (-lm) が必要ですが、t2 と t3 には必要ありません。個別のルールを作成するのは面倒です。数学ライブラリにリンクされた 3 つのターゲットを必要とする単一のルールにより、問題が回避されます。ただし、t2.so と t3.so では数学ライブラリが使用されていないため、ターゲット サイズのインフレが発生します。

何か案は?

4

3 に答える 3

1

これは、必要なヘッダーを見つけるほど簡単には理解できません。gcc -MMはプリプロセッサを使用するためのいくつかの凝った方法ですが、コードの使用方法や動作方法についてはほとんど何も知りません。でいっぱいのヘッダーを含めるか、#define複雑な依存関係ライブラリの依存関係を導入することができます。

私はすべてのターゲット(あなたの場合は3)の明示的なリンク依存関係を書くことに固執します。で一般的な依存関係を収集できますLDFLAGS

于 2010-03-19T04:33:47.820 に答える
1

ldさんの--traceオプションは良いスタートのようです。出力にはフォーマットが必要ですが、適切な情報がすべて含まれていると思います。

私の呼び出しは次のようになります。

$ g++ -o foo a.o b.o -l sfml-graphics -l sfml-window -Wl,--trace
/usr/bin/ld: mode elf_i386
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crti.o
/usr/lib/gcc/i686-linux-gnu/4.6/crtbegin.o
a.o
b.o
-lsfml-graphics (/usr/lib/gcc/i686-linux-gnu/4.6/../../../../lib/libsfml-graphics.so)
-lsfml-window (/usr/lib/gcc/i686-linux-gnu/4.6/../../../../lib/libsfml-window.so)
-lstdc++ (/usr/lib/gcc/i686-linux-gnu/4.6/libstdc++.so)
-lm (/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/libm.so)
-lgcc_s (/usr/lib/gcc/i686-linux-gnu/4.6/libgcc_s.so)
/lib/i386-linux-gnu/libc.so.6
(/usr/lib/i386-linux-gnu/libc_nonshared.a)elf-init.oS
/lib/i386-linux-gnu/ld-linux.so.2
-lgcc_s (/usr/lib/gcc/i686-linux-gnu/4.6/libgcc_s.so)
/usr/lib/gcc/i686-linux-gnu/4.6/crtend.o
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crtn.o
于 2012-08-07T00:32:20.257 に答える
0

「nm」を使ってみましたか?オブジェクト/ライブラリ ファイル内の定義済みおよび未定義のシンボルのリストが表示されます (こちらのドキュメントを参照してください

私が使用を検討しているBernd Striederによるこの投稿で言及されているアプローチがあります-

1. Use nm to generate a list of symbols in all object/library files involved. 
2. This file is parsed and basically the (U)ndefined and (T)ext symbols 
   and the symbols of main functions are filtered out and mapped to their 
   object files. I found that U and T symbols suffice, which reduces the 
   overall problem considerably compared to the linker, which has to 
   consider all symbols. 
3. The transitive hull of the dependency relation according to U and T 
   symbols between object files is being calculated. 
4. A list of object files needed to resolve all dependencies can be 
   printed for any object file. 
5. For any main object file, a make target to link it is arranged.
于 2012-08-24T22:59:15.377 に答える