
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ランキング
-
共有ライブラリが見つからない
-
.cshrcでのエラー
-
Apace2のインストールでエラー
-
proftpdをアンインストールしたい
-
Apacheインストール時にエラー
-
apacheで「You don't have perm...
-
Solarisでプロンプトの変更方法
-
複数ファイルのシンボリックリンク
-
大塚商会で新しくシステム、ス...
-
ソフトのインストール場所って...
-
OSごとに対応パソコンというも...
-
illustratorを日本語仕様にする...
-
_access関数が EACCES エラーと...
-
デスクトップで起動できて、ノ...
-
OS インストール場所確認
-
バッチスクリプト処理でエラー...
-
PhotoExpressCalrendarCheckarS...
-
昔のPCは本当にこうだったので...
-
You Tube動画のダウンロードが...
-
VBからACCESSのレポートをプレ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DebianのApache(掲示板)CGIエ...
-
Postfixでmailコマンドを使用し...
-
.cshrcでのエラー
-
バッチファイルでのスペースの入力
-
cygwinでno such file or direc...
-
pkg-config のPKG_CONFIG_PATH...
-
gccでx11コンパイル
-
".bashrc" E509: バックアップ...
-
「/usr/bin/ld」の問題について...
-
/usrがいっぱいになって。mount...
-
共有ライブラリが見つからない
-
複数ファイルのシンボリックリンク
-
linuxのフォルダと配置について
-
CentOS X Window Systemエラー
-
MySQL関連のパスを通すには
-
proftpdをアンインストールしたい
-
Apace2のインストールでエラー
-
Apacheインストール時にエラー
-
Red Hat Linux7.1J によるメー...
-
ヘッダファイルの位置
おすすめ情報