0

私のconfigure/configure.ac中で、私は複数のPKG_CHECK_MODULES呼び出しを行います。それらのほとんどは同じ-I path:-I/usr/local/include、そしてまた同じを返します-L path: -L/usr/local/lib.

gccは一度に1つのソースをコンパイルするので、それは何の違いも-I pathありません。複数のソースがコンパイルされる場合、違いが生じる可能性がありますか?

ただし、次の構成が可能であるため、ライブラリにはおそらく違いがあります。

-L / usr / local / lib -lX11 -L / usr / lib -lcurses -L / opt / lib -lcups

-L optionそれぞれが現在のトップライブラリの検索パスを変更すると思います。

これはすべて正しいですか?冗長性を無視する必要-Iがありますか、それともパスを折りたたむ必要がありますか?それらを折りたたむ方法は?

(追記。、の文字について混乱しないでください。-I最初-lの文字は大文字です。"i"これについては、パスオプションを含めてください) 。

4

2 に答える 2

0

-Lオプションは、実際には現在の検索パスの最後に何かを追加するだけです。つまり、さまざまな場所にあるさまざまなライブラリへのリンクは、一般的な解決策を生み出すのが難しい問題です。A と B の 2 つの場所に同じ 2 つのライブラリがあり、A の最初のライブラリと B の 2 番目のライブラリが必要な場合、-Lオプションでそれを行うのは驚くほど面倒です。.so代わりに、リンク行にファイルへのフルパスを含める必要があります。

つまり、次のようになります。

-L/usr/local/lib -lX11 -L/usr/lib -lcurses -L/opt/lib -lcups

libcups は、/usr/local/lib最初に、次に/usr/lib、そしてで検索され/opt/libます。に libcups がある場合/usr/local/libでも、間違ったものを取得します。確実にする唯一の方法は、(これは移植性が低く、たとえば HP-UX や AIX では動作しません) に置き換えること-L/opt/lib -lcupsです/opt/lib/libcups.so

あなたの質問に答えるために、ほとんどの場合、冗長性をクリーンアップしようとはしません。この種のコンパイル コマンド ラインは、複数のライブラリを使用するプロジェクトではかなり一般的です。

于 2013-03-17T23:21:45.030 に答える
0

PKG_CHECK_MODULES必要なフラグをLDFLAGSandCPPFLAGSではなくFOO_LIBSandに配置するように変更し、既に存在する場合は追加せず、結果が冗長FOO_CFLAGSかどうかをチェックすることができます。その際、によって返される情報を検証するためにpkg-configの呼び出しを追加することをお勧めします。これには、と を明示的に参照する必要がなくなるため、すべての が大幅にクリーンアップされるという追加の利点があります。しかし、おそらく使用をやめた方が簡単です。( PKG_CHECK_MODULES は有害と見なされますか?を参照) AC_CHECK_LIBpkg-configMakefile.am@FOO_LIBS@@FOO_CFLAGS@PKG_CHECK_MODULES

于 2013-03-19T12:28:59.863 に答える