-h <名前>との間の差と-o <出力> CCのオプション(C ++)
質問
私は.soのライブラリを構築していますと思っていた - / W -hと(のSun Studio C ++を使用して)-oのccコンパイラオプションBの違いは何ですか?
彼らは同じものを指しているがない - 出力ファイルの名前を
解決
-o
は、コンパイラによってディスクに書き込まれるファイルの名前です。
-h
がこのファイルにリンクELFバイナリに記録される名前です。
一般的な用途の1つは、ライブラリのマイナーバージョン番号を提供することです。例えば、もし あなたが共有ライブラリを調べてlibfooを作成している、あなたが行う可能性があります:
cc -o libfoo.so.1.0 -h libfoo.so.1 *.o
ln -s libfoo.so.1.0 libfoo.so.1
ln -s libfoo.so libfoo.so.1
そして、あなたは
を使用して、ハローワールドのアプリとそれに対するリンクをコンパイルした場合cc -o hello -lfoo
こんにちはためエルフのバイナリは、(そのことができますNEEDED
ためlibfoo.so.1
エントリを記録します
)elfdump -d hello
を実行してご覧ください。
次に、あなたはに-o
値を変更することができます
libfoo.so.1.1
しかしlibfoo.so.1
で-hを残す - あなたはすでに構築されたすべてのプログラムを
1.0でまだ実行時にlibfoo.so.1
ロードしよう、そうせずに作業を続けます
再建されていますが、それは1.1だLSを経由して表示されます。
、彼らがしている同じディレクトリにライブラリを構築するときにこれはまた時々使用されています あなたが別のインストールディレクトリを持っているか、インストールしない場合は、実行時に使用 パッケージングシステムを介して。あなたを実行しているプログラムをクラッシュ回避するために、 ライブラリのバイナリを上書きし、そしてときに起動することができないプログラムを避けるために、 あなたは、建物の真ん中にいる、いくつかのMakefileを行います。
cc -o libfoo.so.1.new -h libfoo.so.1 *.o
rm libfoo.so.1 ; mv libfoo.so.1.new libfoo.so.1
(Xから古いImakeにメイクファイルジェネレータによって構築されたメイクファイルは、一般的にこれを行う。)
他のヒント
彼らは別の名前に言及しています。ファイルシステム上の1 - 具体的には、-o
オプションは、ファイルのの実際のの名前です。 -h
オプションは、最終的なオブジェクト・ファイル内のの内部のDT_SONAME
を設定します。これは、共有オブジェクトが他のモジュールによって内部的に参照されている名前です。私はそれはあなたがそれにリンクオブジェクト上ldd
を実行したときにも表示される名前だと信じています。
-oオプションは、出力ファイルに名前を付けます。この固有の名前は、ダイナミックローダによって使用された場合、ファイル名に優先しており、それが正しいライブラリをのぞくために事前に定義されたルールを使用することができます。
あなたは固有の名前がそのコマンドで指定したライブラリに記録されたものを見ることができます
elfdumpを-d xxx.so | grepのSONAME
詳細はこちらをご覧ます:
http://docs.oracle.com /cd/E23824_01/html/819-0690/chapter4-97194.htmlする