質問

私は.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を実行したときにも表示される名前だと信じています。

-hオプションは、ライブラリ内の固有の名前を設定する一方、

-oオプションは、出力ファイルに名前を付けます。この固有の名前は、ダイナミックローダによって使用された場合、ファイル名に優先しており、それが正しいライブラリをのぞくために事前に定義されたルールを使用することができます。

あなたは固有の名前がそのコマンドで指定したライブラリに記録されたものを見ることができます

elfdumpを-d xxx.so | grepのSONAME

詳細はこちらをご覧ます:

http://docs.oracle.com /cd/E23824_01/html/819-0690/chapter4-97194.htmlする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top