プロが教える店舗&オフィスのセキュリティ対策術

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

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

A 回答 (2件)

リンカの仕様です.


基本的に, ライブラリについては「前にあるファイルで undefined だったものを後ろのファイルから探す」という動作をします. だから
-lmilter test.c
は NG でも
test.c -lmilter
の順なら OK.

この回答への補足

なるほど、そうだったのですね。
けれど謎なのは、milter.aではなくて、OS標準添付のmilter.soをリンクしていたときは、
-lmilter test.c
でもリンクできていたのです。so と a ではリンクの仕方がちがう、
ということなのでしょうか。。?

補足日時:2007/11/11 12:10
    • good
    • 0

う~ん, どうなんでしょうね....


.a と .so では機構が違いますから, 違う結果になってもおかしくないとは言えます... でも, なんか不親切な感じもしますね. いずれにしても, ライブラリの類は後ろにもっていった方が安全だと思いますが.
    • good
    • 0
この回答へのお礼

なるほど、そうですね。。
ありがとうございました!

お礼日時:2007/11/12 09:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!