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.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
とすることもできます。この場合は引数の順番は問題にはなりません。
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 を読んで不明点があればその情報に限って検索するのがいいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- その他(プログラミング・Web制作) python 2 2022/12/23 09:06
- 日本語 こんにちは。 “終わっかぞ” と “終わりだ” の差を教えていただけますか。 For example 3 2023/03/11 20:39
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- 英語 What is leveraged trading?Borrowing money to multi 1 2022/04/03 16:36
- オープンソース stable diffusionのインストールがうまくいきません。 1 2023/06/20 13:09
- 英語 We examined the rungs of every chair in the hotel, 1 2022/10/02 11:27
- TOEFL・TOEIC・英語検定 英検準1級英作文の添削をお願いします。 ポイントはCurriculumとGlobalizationを 4 2023/05/29 11:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
".bashrc" E509: バックアップ...
-
バッチファイルでのスペースの入力
-
.cshrcでのエラー
-
cygwinでno such file or direc...
-
Solarisでプロンプトの変更方法
-
PowerShellで自分が書いたコマ...
-
バッチファイルで多重起動を防ぐ
-
dsmoveコマンドをBATファイルで...
-
誰かにサーバにあるデータを消...
-
ソースコードからインストール...
-
バッチスクリプト処理でエラー...
-
CSHが使えない REDHAT
-
shell関数について
-
メーリングリスト宛てのメール...
-
Macの手書き漢字入力ツールにつ...
-
MySQLへのDB::connectで、faile...
-
mac os 10.6の入ったMac mini ...
-
_access関数が EACCES エラーと...
-
ソフトのインストール場所って...
-
CPUとOS の違いは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチファイルでのスペースの入力
-
.cshrcでのエラー
-
linuxのフォルダと配置について
-
pkg-config のPKG_CONFIG_PATH...
-
cygwinでno such file or direc...
-
Postfixでmailコマンドを使用し...
-
apacheで「You don't have perm...
-
Apace2のインストールでエラー
-
複数ファイルのシンボリックリンク
-
numpy 動作確認エラーについて
-
共有ライブラリが見つからない
-
DebianのApache(掲示板)CGIエ...
-
proftpdをアンインストールしたい
-
「/usr/bin/ld」の問題について...
-
".bashrc" E509: バックアップ...
-
/usr/local
-
Solarisでプロンプトの変更方法
-
XEmacsにnxml-modeをインストー...
-
REDHAT8 初心者です。UP2DATEが...
-
cygwinでinetdをサービスに登録...
おすすめ情報