• ベストアンサー
  • すぐに回答を!

gccの「-l」オプションとライブラリの関係

  • 質問No.3502572
  • 閲覧数703
  • ありがとう数2
  • 回答数2
gcc の -l オプションってどのような動作なのでしょうか??

sendmail関係の少々実験的な開発をするために、
OSに標準で入っているsendmail関係のライブラリである、
  /usr/lib/libmilter.a
  /usr/lib/libmilter.so
  /usr/lib/libmilter.so.3
を削除して、
sendmailをソースからコンパイルして、
sendmailのソースの中のlibmilterもコンパイルしました。

この時点で、libmilter.a は、コンパイルしたディレクトリ(/usr/local/src/sendmail-8.14.2/)の下の
  /usr/local/src/sendmail-8.14.2/obj.FreeBSD.6.2-RELEASE.i386/libmilter/
の中にしか存在しないのですが・・・

gcc -pthread -lc_r \
  -L/usr/local/src/sendmail-8.14.2/obj.FreeBSD.6.2-RELEASE.i386/libmilter/ \
  -lmilter \
  test.c

としてコンパイルしようとすると、libmilter の中にある関数が、
ことごとく「undefined reference」になってしまいます。
これを、-L や -lオプションでライブラリを探させるのをやめて、明示的に

gcc -pthread -lc_r \
  test.c \
  /usr/local/src/sendmail-8.14.2/obj.FreeBSD.6.2-RELEASE.i386/libmilter/libmilter.a

と書くと、問題なくコンパイル&リンクできるのですが・・・
なぜなのでしょうか??

質問者が選んだベストアンサー

  • 回答No.1
  • ベストアンサー

ベストアンサー率 23% (3656/15482)

リンカの仕様です.
基本的に, ライブラリについては「前にあるファイルで undefined だったものを後ろのファイルから探す」という動作をします. だから
-lmilter test.c
は NG でも
test.c -lmilter
の順なら OK.
補足コメント
noname#43437
なるほど、そうだったのですね。
けれど謎なのは、milter.aではなくて、OS標準添付のmilter.soをリンクしていたときは、
-lmilter test.c
でもリンクできていたのです。so と a ではリンクの仕方がちがう、
ということなのでしょうか。。?
投稿日時:2007/11/11 12:10

その他の回答 (全1件)

  • 回答No.2

ベストアンサー率 23% (3656/15482)

う~ん, どうなんでしょうね....
.a と .so では機構が違いますから, 違う結果になってもおかしくないとは言えます... でも, なんか不親切な感じもしますね. いずれにしても, ライブラリの類は後ろにもっていった方が安全だと思いますが.
お礼コメント
noname#43437
なるほど、そうですね。。
ありがとうございました!
投稿日時:2007/11/12 09:24
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ページ先頭へ