いつもお世話になっております。
コンパイラーがどうやって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に自動的(勝手に)に決められて、我々はどうやってそのインストール先を知る可能でしょうか。
g++ コンパイラーとリンクファイルの場所の決め方
Re: g++ コンパイラーとリンクファイルの場所の決め方
Cygwinのg++で試しましたが、man g++内のpathという文字列を検索してみてください。
g++ -print-multi-os-directory で、../libと出ましたが、これはホームからみた階層ではないようです。
which g++ で、/usr/bin/g++ と出ましたので、/usr/libを確認すると、.aファイルがありました。これはWindowsでいう.libファイルに相当します。
g++ -print-multi-os-directory で、../libと出ましたが、これはホームからみた階層ではないようです。
which g++ で、/usr/bin/g++ と出ましたので、/usr/libを確認すると、.aファイルがありました。これはWindowsでいう.libファイルに相当します。
Re: g++ コンパイラーとリンクファイルの場所の決め方
あんどーなつ様
いつもお世話になっております
早速お返答ありがとうございます。
私のubuntu(Linux)PC(2台)のディレクトリ構造はみな
Computer/lib と
Computer/usr/lib
となっています。
なぜ2つのlibがあるのでしょうか。
内容的にも似ています。
*.so, *.a より構成されています。
理由なんでしょうか
いつもお世話になっております
早速お返答ありがとうございます。
私のubuntu(Linux)PC(2台)のディレクトリ構造はみな
Computer/lib と
Computer/usr/lib
となっています。
なぜ2つのlibがあるのでしょうか。
内容的にも似ています。
*.so, *.a より構成されています。
理由なんでしょうか
Re: g++ コンパイラーとリンクファイルの場所の決め方
Linuxにおいて、/lib, /usr/lib, /usr/local/lib にはそれぞれ違う役割があったと思います。
詳細については、下記ページをご参照ください。
http://www.7key.jp/computer/linux/directory.html
詳細については、下記ページをご参照ください。
http://www.7key.jp/computer/linux/directory.html
Re: g++ コンパイラーとリンクファイルの場所の決め方
こちらのページのほうが詳しく書いてあるみたいです。
http://www.wdic.org/w/TECH//lib
http://www.wdic.org/w/TECH//usr
Linuxのカーネルはアプリケーション同様C言語で出来ていますが、カーネル用のライブラリというものが存在します。
例えばkprintf関数はカーネルやドライバが画面出力をするときに使う関数です。
printf関数は実際にはシステムコールでOSに文字列を渡す操作をするので、printfとkprintfでは動作が違うわけです。
http://www.wdic.org/w/TECH//lib
http://www.wdic.org/w/TECH//usr
Linuxのカーネルはアプリケーション同様C言語で出来ていますが、カーネル用のライブラリというものが存在します。
例えばkprintf関数はカーネルやドライバが画面出力をするときに使う関数です。
printf関数は実際にはシステムコールでOSに文字列を渡す操作をするので、printfとkprintfでは動作が違うわけです。
Re: g++ コンパイラーとリンクファイルの場所の決め方
g++ でコンパイルおよびリンクする際、-v オプションを指定すると、LIBRARY_PATH にライブラリファイルの検索対象となるパスが羅列されています。百合子 さんが書きました: いつもお世話になっております。
コンパイラーがどうやってlinkファイルの場所を断定できるのでしょうか。
環境:ubuntu14.04 (Linuxの一種)
例えば、
g++ xxx.cpp -lAAA -lBBB
先頭の(-l)はlinkの意味と思います。
xxx.cpp は現在ディレクトリにあります。
AAA とlBBBはlibrary ファイルで、拡張子は *.a で(多分)、
現在ディレクトリに存在しません。
これで、うまくコンパイルとリンクできました。
不思議に
上記命令自体はAAA.a とlBBB.aの存在場所を提供していないのに、g++はどうやって、リンクできるのでしょうか。
表示の後半では collect2 コマンドのオプションとしてライブラリの検索場所が全て -L で指定されていることが確認できます。
また、LIBRARY_PATHに羅列されているパスは、g++ -print-search-dirs で表示される libraries の内、実行環境に実在するディレクトリへのパスのみが列挙されています。
g++ -print-search-dirs で表示される情報は、g++(gcc)がコンパイルおよびリンクを行うときに使用するコマンドやライブラリが納められた場所を検索するためのパスの一覧です。
Ubuntu Software Center を使用してインストールした際に確認できるログは以下です。百合子 さんが書きました: 合わせて、
AAA.a とlBBB.aはubuntuの「Ubuntu Software Center」を使ってインストールされたと思いますが、
そのインストール先はいつもubuntuに自動的(勝手に)に決められて、我々はどうやってそのインストール先を知る可能でしょうか。
Ubuntu Software Center のインストールログについて
Does the Software Center log installations?
Where does the software-center store its history?
/var/log/apt のログの簡易説明
Ubuntu/aptコマンドの操作ログの在処と確認方法