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

Linuxのgccで、LIBのパスを設定する方法が知りたいのですが、gccについて詳しい書籍やサイトがありましたら、教えてください。

例)gcc -I/usr/local/example/include test.c

/tmp/ccOFpCBo.o(.text+0x26): In function `main':
: undefined reference to `EXAMPLE_1'
/tmp/ccOFpCBo.o(.text+0x37): In function `main':
: undefined reference to `EXAMPLE_2'
/tmp/ccOFpCBo.o(.text+0x48): In function `main':
: undefined reference to `EXAMPLE_3'
collect2: ld はステータス1で終了しました。



また、ldとはVC6++でいう LINKのことでしょうか?

A 回答 (2件)

まず、ライブラリには共有ライブラリ (拡張子は .so、Windows で言う dll) と静的ライブラリ (拡張子は .a) があります。



例えば、以下のようなファイルが同時に存在する場合、

/usr/local/example/lib/libmylib.so
/usr/local/example/lib/libmylib.a

次のコマンドでコンパイルすると、共有ライブラリである /usr/local/example/lib/libmylib.so とリンクされることになっています。(共有ライブラリが存在しない場合は静的ライブラリにリンクされる)

gcc -o test -I/usr/local/example/inlude \
-L/usr/local/example/lib -lmylib test.c

このようにしてコンパイルされたものをそのまま実行しても、実行時にライブラリが見つけられずにエラーとなってしまいます。これを回避する方法として、以下の4つの方法があります。(お勧めの順に記述)

1. rpath を設定する

gcc -o test -I/usr/local/example/inlude \
-L/usr/local/example/lib -Wl,-rpath \
-Wl,/usr/local/example/lib test.c -lmylib

2. LD_RUN_PATH 環境変数を設定してからコンパイルする。

export LD_RUN_PATH=/usr/local/example/lib
gcc -o test -I/usr/local/example/inlude \
-L/usr/local/example/lib test.c -lmylib

3. 実行前に LD_LIBRARY_PATH 環境変数を設定する。

export LD_LIBRARY_PATH=/usr/local/example/lib
./test

4. /etc/ld.so.conf に /usr/local/example/lib を追加する。

強引に静的ライブラリにリンクしたい場合は、

gcc -o test -I/usr/local/example/inlude \
test.c /usr/local/example/lib/libmylib.a

とします。この場合は 1 ~ 4 の手順を行わなくても構いませんが実行ファイルのサイズが大きくなってしまいます。また、gcc コマンドの引数で test.c と /usr/local/example/lib/libmylib.a の順番が逆になるとエラーになるので注意してください。

もちろん、共有ライブラリに対しても、

gcc -o test -I/usr/local/example/inlude \
test.c /usr/local/example/lib/libmylib.so

とすることもできます。この場合は引数の順番は問題にはなりません。
    • good
    • 0

>また、ldとはVC6++でいう LINKのことでしょうか?


そうです。

コンパイルは正常に終了していて、リンクでシンボルが見つからないというエラーですね。リンクしたいモジュールが /usr/local/example/lib/libmylib.a に入っているとしたら、
gcc -I/usr/local/example/inlude -L/usr/local/example/lib -lmylib test.c
パスと、ファイル名(から先頭のlibを除いたもの)を別々に指定します。

>gccについて詳しい書籍やサイトがありましたら
まず、man gcc を読んで不明点があればその情報に限って検索するのがいいと思います。
    • good
    • 0

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