g++ コンパイラーとリンクファイルの場所の決め方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
百合子

g++ コンパイラーとリンクファイルの場所の決め方

#1

投稿記事 by 百合子 » 8年前

いつもお世話になっております。
コンパイラーがどうやってlinkファイルの場所を断定できるのでしょうか。
環境:ubuntu14.04 (Linuxの一種)
例えば、
g++ xxx.cpp -lAAA -lBBB
先頭の(-l)はlinkの意味と思います。

xxx.cpp は現在ディレクトリにあります。
AAA とlBBBはlibrary ファイルで、拡張子は *.a で(多分)、
現在ディレクトリに存在しません。
これで、うまくコンパイルとリンクできました。

不思議に
上記命令自体はAAA.a とlBBB.aの存在場所を提供していないのに、g++はどうやって、リンクできるのでしょうか。

合わせて、
AAA.a とlBBB.aはubuntuの「Ubuntu Software Center」を使ってインストールされたと思いますが、
そのインストール先はいつもubuntuに自動的(勝手に)に決められて、我々はどうやってそのインストール先を知る可能でしょうか。

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: g++ コンパイラーとリンクファイルの場所の決め方

#2

投稿記事 by あんどーなつ » 8年前

Cygwinのg++で試しましたが、man g++内のpathという文字列を検索してみてください。
g++ -print-multi-os-directory で、../libと出ましたが、これはホームからみた階層ではないようです。
which g++ で、/usr/bin/g++ と出ましたので、/usr/libを確認すると、.aファイルがありました。これはWindowsでいう.libファイルに相当します。

百合子

Re: g++ コンパイラーとリンクファイルの場所の決め方

#3

投稿記事 by 百合子 » 8年前

あんどーなつ様
いつもお世話になっております
早速お返答ありがとうございます。
私のubuntu(Linux)PC(2台)のディレクトリ構造はみな 
Computer/lib と
Computer/usr/lib
となっています。

なぜ2つのlibがあるのでしょうか。
内容的にも似ています。
*.so, *.a より構成されています。

理由なんでしょうか

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: g++ コンパイラーとリンクファイルの場所の決め方

#4

投稿記事 by あんどーなつ » 8年前

Linuxにおいて、/lib, /usr/lib, /usr/local/lib にはそれぞれ違う役割があったと思います。
詳細については、下記ページをご参照ください。

http://www.7key.jp/computer/linux/directory.html

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: g++ コンパイラーとリンクファイルの場所の決め方

#5

投稿記事 by あんどーなつ » 8年前

こちらのページのほうが詳しく書いてあるみたいです。
http://www.wdic.org/w/TECH//lib
http://www.wdic.org/w/TECH//usr

Linuxのカーネルはアプリケーション同様C言語で出来ていますが、カーネル用のライブラリというものが存在します。
例えばkprintf関数はカーネルやドライバが画面出力をするときに使う関数です。
printf関数は実際にはシステムコールでOSに文字列を渡す操作をするので、printfとkprintfでは動作が違うわけです。

sleep

Re: g++ コンパイラーとリンクファイルの場所の決め方

#6

投稿記事 by sleep » 8年前

百合子 さんが書きました: いつもお世話になっております。
コンパイラーがどうやってlinkファイルの場所を断定できるのでしょうか。
環境:ubuntu14.04 (Linuxの一種)
例えば、
g++ xxx.cpp -lAAA -lBBB
先頭の(-l)はlinkの意味と思います。

xxx.cpp は現在ディレクトリにあります。
AAA とlBBBはlibrary ファイルで、拡張子は *.a で(多分)、
現在ディレクトリに存在しません。
これで、うまくコンパイルとリンクできました。

不思議に
上記命令自体はAAA.a とlBBB.aの存在場所を提供していないのに、g++はどうやって、リンクできるのでしょうか。
g++ でコンパイルおよびリンクする際、-v オプションを指定すると、LIBRARY_PATH にライブラリファイルの検索対象となるパスが羅列されています。
表示の後半では collect2 コマンドのオプションとしてライブラリの検索場所が全て -L で指定されていることが確認できます。

また、LIBRARY_PATHに羅列されているパスは、g++ -print-search-dirs で表示される libraries の内、実行環境に実在するディレクトリへのパスのみが列挙されています。

g++ -print-search-dirs で表示される情報は、g++(gcc)がコンパイルおよびリンクを行うときに使用するコマンドやライブラリが納められた場所を検索するためのパスの一覧です。
百合子 さんが書きました: 合わせて、
AAA.a とlBBB.aはubuntuの「Ubuntu Software Center」を使ってインストールされたと思いますが、
そのインストール先はいつもubuntuに自動的(勝手に)に決められて、我々はどうやってそのインストール先を知る可能でしょうか。
Ubuntu Software Center を使用してインストールした際に確認できるログは以下です。

Ubuntu Software Center のインストールログについて
Does the Software Center log installations?
Where does the software-center store its history?

/var/log/apt のログの簡易説明
Ubuntu/aptコマンドの操作ログの在処と確認方法

百合子

Re: g++ コンパイラーとリンクファイルの場所の決め方

#7

投稿記事 by 百合子 » 8年前

親切なご指導ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る