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

このQ&Aのポイント
  • gccの「-l」オプションは、ライブラリをリンクするためのオプションです。
  • リンクするライブラリは、-lオプションの後に指定します。
  • 指定したライブラリが見つからない場合は、「undefined reference」エラーが発生します。
回答を見る
  • ベストアンサー

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

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 と書くと、問題なくコンパイル&リンクできるのですが・・・ なぜなのでしょうか??

noname#43437
noname#43437

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

noname#43437
質問者

補足

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

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

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

noname#43437
質問者

お礼

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

関連するQ&A

  • gccでの共有ライブラリのver指定

    表題の件に関して質問させていただきます。 たとえば/usr/libにある;libA.soをリンクしたい時、gccでは gcc -lA としますが、libA.so.1,libA.so.2‥と複数バージョンがある場合、バージョンまで指定してコンパイルすることは可能でしょうか? サーバー権限を持っていないので、シンボリックリンクを張り直すという手は使えません。 また、自分のアカウントで同共有ライブラリを用意したのですが、/usr/libが優先されてしまい、自分のアカウントのライブラリを設定することは出来ません。 解決法をご存知の方、ご教授お願い致します。

  • gccやg++がGNU製かどうかの確認法は?

    初心者質問で失礼致します。 各UNIX上でgccやg++がGNU製のものかどうかは何処で確認できるのでしょうか? % gcc -v Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.6/2.95.3/specs gcc version 2.95.3 20010315 (release) % g++ -v Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.6/2.95.3/specs gcc version 2.95.3 20010315 (release) となりましたがGNU製なら"GNU"と表示されるのでしょうか?

  • gcc使用時のエラー

    現在openCVで画像処理プログラミングを行おうとしております。 一通りコーディングが終わった所でgccを使用してコンパイルをかけた所、 下記のようなエラーが出ました。 (コード中でhighgui.h及びcv.hをインクルードしています。) /tmp/cch6hMvI.o: In function `cvDecRefData': test.c:(.text+0xaa6): undefined reference to `cvFree_' test.c:(.text+0xb2e): undefined reference to `cvFree_' これはライブラリへのパスが通っていないものと思い、端末から export LD_LIBRARY_PATH=/usr/local/lib/ としましたが、それでもエラーが出ます。さらに下記も試してみましたが同様です。 gcc -L/usr/local/lib -o test test.c (/usr/local/lib/以下にlibopencv_core.so.2.4等が置いてあります。) pkg-configを使用すればコンパイルは通るのですが、 何がどうなってエラーになっているのかイマイチ分からず気持ちが悪いです。 1、上記エラーは共有ライブラリへのパスが通っていないために起きているものですか? 2、そうだとすれば、-Lやexport LD_LIBRARY_PATHで解決出来ないのは何故でしょう? 上記だけで情報が不足している場合は提示致しますので、 どうぞよろしくお願い致します。

  • GCCでライブラリが足りない

    はじめまして。 LindowsOS4.0を使っています。 コンパイルができずに困っています。 GCCとMAKEをインストールしました(Lindowsはどちらも入っていないのです。Debian/Woodyベースと言われています)。 gcc 2.95.4 make 3.79.1 which gcc とすると、/usr/bin/gcc と表示されます。 で、./configure すると、 ..... checking whether the C compiler works ... no と表示されコンパイルエラーになります。 configure.log を見ると、 ------------------- checking for gcc configure:916: checking whether the C compiler (gcc ) works configure:932: gcc -o conftest conftest.c 1>&5 /usr/bin/ld: cannot open crt1.o: No such file or directory collect2: ld returned 1 exit status configure: failed program was: #line 927 "configure" #include "confdefs.h" main(){return(0);} --------------------- とか --------------------- checking for gcc configure:905: checking whether the C compiler (gcc ) works configure:921: gcc -o conftest conftest.c 1>&5 /usr/bin/ld: cannot open crt1.o: No such file or directory collect2: ld returned 1 exit status configure: failed program was: #line 916 "configure" #include "confdefs.h" main(){return(0);} ---------------------- とかなっています。 confdefs.hというのは何かのライブラリなのでしょうか?これが無いとconfigureできないのでしょうか?? よろしくお願いいたします。

  • Macで標準ライブラリのファイル

    Macで標準ライブラリの .cファイルは、どこにあるのでしょうか?? FreeBSDなら/usr/src/lib/libc/~~~ にあるのですが、Macでは見つからないのです。。"find / -name printf.c" などとしてみたのですがヒットせず。 OSのバージョンは10.3です。

  • gcc バージョン違いによるコンパイルエラー

    C言語でWeb系のプログラムを作成している者です。 以前まで、OSはFreeBSD 4.11-RELEASE-p12・gccのバージョンは2.95.4でコンパイルできていたプログラムが、OSはFreeBSD 5.4-RELEASE-p8・gccのバージョンは・gccのバージョンは 3.4.2で、今まで出なかったようなエラーが沢山出現し、コンパイルできなくなってしまいました。 OSをインストールし直すのは、既に稼働中のサイトですので厳しく、GCCのバージョンを下げるかソースを書き換えるかして対処する方向で行きたいと考えております。 しかし、gccの2.95.4の圧縮ファイルはもう、gccの公式サイトに落ちておらず、バージョンダウンは難しそうです。 gccのバージョンによるコンパイルエラーを乗り越えた方、ご指摘など有りましたらお教えくださると幸いです。

  • MovableType5のエラー文を教えて下さい。

    お世話になります。ご質問させてください。 OCNのスタンダードプランにMovabletType5.02をFTPでアップロードしてmt.cgiにアクセスしました。ログインをクリックすると下記のエラー文が表示されます。エラー文はどのような意味なのでしょうか?また、解決方法をご存知の方は教えて下さい。 ちなみにmt-check.cgiにアクセスすると500エラーが表示されます。 パーミションを変更しても500エラーが表示されます。 他のサーバーにはMTを何回もインストールして設定したこともあります。 宜しくお願い致します。 Got an error: Can't locate Encode.pm in @INC (@INC contains: /usr/home/○○○/www/htdocs/mt/extlib lib /usr/local/lib/perl5/5.6.1/i386-freebsd /usr/local/lib/perl5/5.6.1 /usr/local/lib/perl5/site_perl/5.6.1/i386-freebsd /usr/local/lib/perl5/site_perl/5.6.1 /usr/local/lib/perl5/site_perl/5.6.0/i386-freebsd /usr/local/lib/perl5/site_perl/5.6.0 /usr/local/lib/perl5/site_perl/5.005/i386-freebsd /usr/local/lib/perl5/site_perl/5.005 /usr/local/lib/perl5/site_perl .

    • ベストアンサー
    • CGI
  • cygwin gccでのコンパイル

    cygwinをインストールをallでインストールし、gccでコンパイルを行おうとしたところ /usr/lib/gcc-lib/i686-pc-cygwin/3.3.3/../../../../i686-pc-cygwin/bin/ld: cannot find -luser32 collect2: ld returned 1 exit status と表示され、コンパイル出来ません。 なにが原因でしょうか。 以上、宜しくお願い致します。

  • cygwinのgccによるコンパイルうまくいかない

    cygwinをsetup.exeからminimum installしました。 追加的にgcc emacs xwindow system xwin terminalをインストールしました。 そしてターミナルを起動してgcc test.c -o test.exe と入力すると/home/test.c:1: error: bad value (generic) for -mtune= switch と、エラーが出てうまくコンパイル出来ません。 mtune=generic,native,i386...k6,athlon-xp..c6-2などいろいろ試しましたが全て失敗。 どうやったらコンパイルが出来るようになるか教えてください! 環境: >gcc -v >Using built-in specs. COLLECT_GCC=gcc Target: i686-pc-cygwin コンフィグオプション: /gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/configure --srcdir=/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/lib --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --datarootdir=/usr/share --docdir=/usr/share/doc/gcc4 -C --datadir=/usr/share --infodir=/usr/share/info --mandir=/usr/share/man -v --with-gmp=/usr --with-mpfr=/usr --enable-bootstrap --enable-version-specific-runtime-libs --libexecdir=/usr/lib --enable-static --enable-shared --enable-shared-libgcc --disable-__cxa_atexit --with-gnu-ld --with-gnu-as --with-dwarf2 --disable-sjlj-exceptions --enable-languages=ada,c,c++,fortran,java,lto,objc,obj-c++ --enable-graphite --enable-lto --enable-java-awt=gtk --disable-symvers --enable-libjava --program-suffix=-4 --enable-libgomp --enable-libssp --enable-libada --enable-threads=posix --with-arch=i686 --with-tune=generic --enable-libgcj-sublibs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4 CXX_FOR_TARGET=g++-4 GNATMAKE_FOR_TARGET=gnatmake GNATBIND_FOR_TARGET=gnatbind --with-ecj-jar=/usr/share/java/ecj.jar スレッドモデル: posix gcc version 4.5.3 (GCC) test.cのsource #include <stdlib.h> #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; [EOF] 素人なので解決するために他に足りない情報があればおしえてくださいね。

  • Cygwin(gcc) lexライブラリ

    WindowsXPにCygwinのすべての項目をInstallにしてインストールして bison -d abc.y flex abc.l と実行し、 abc.tab.c , abc.tab.h , lex.yy.c ができた状態で gcc abc.tab.c -ll とした時 /user/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot find -ll collect2: ld returned 1 exit status とメッセージが表示されコンパイルできないでのですが gccには標準lexライブラリが無いのでしょうか? それとも別のことが原因なのでしょうか? このエラーの回避法、もしくは別のソフトなどでこれと同様のことができるなら教えてください。

専門家に質問してみよう