
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のことでしょうか?
No.1ベストアンサー
- 回答日時:
>また、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 を読んで不明点があればその情報に限って検索するのがいいと思います。
No.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
とすることもできます。この場合は引数の順番は問題にはなりません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
インストールできないですどう...
-
LinuxでWine使うとどのくらいWi...
-
Core 2 Duo の古いパソコンに最...
-
bashでシングルクォート内の変...
-
「トゥ]の出し方
-
LinuxのPCは基本不要PC中古を使...
-
VirtualBox 6.1 → 7.1 でUbuntu...
-
Linux のシェルスクリプトの強...
-
Windowsのローカルディレクトリ...
-
ログにserver reached MaxReque...
-
ubuntuで デイスク/deb/loopと...
-
ssh接続しようとしたらエラーメ...
-
Ububtuでファイル共有できない...
-
ubuntu(linux)のシャットダウン...
-
Ubuntu on Xorgのログインについて
-
unutu24でDISKINFOを読み取る方...
-
テキストファイルをページ番号...
-
mxlinux 起動時エラーについて
-
Lubuntuでとにかく軽量のバージ...
-
ubuntu proのデスクトップ版は...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
LinuxでWine使うとどのくらいWi...
-
Core 2 Duo の古いパソコンに最...
-
VirtualBox 6.1 → 7.1 でUbuntu...
-
インストールできないですどう...
-
ubuntuのシャットダウンが進ま...
-
「トゥ]の出し方
-
Linux のシェルスクリプトの強...
-
ubuntu(linux)のシャットダウン...
-
bashでシングルクォート内の変...
-
WinSCPでLinux(CentOS6.10)に...
-
ubuntuで デイスク/deb/loopと...
-
Ubuntu on Xorgのログインについて
-
私のパソコンでVirtualBoxは使...
-
Ububtuでファイル共有できない...
-
Windowsのローカルディレクトリ...
-
Linuxでブートディスクの交換後...
-
ログにserver reached MaxReque...
-
ssl_request_logの必要性について
-
ssh接続しようとしたらエラーメ...
-
2TBのUSBメモリを2000円ほどで...
おすすめ情報