2016-06-21 7 views
0
  1. dlfcnのその他の機能。実行時に共有オブジェクトライブラリでextern "C"を使用するのはなぜですか?私は<code>dlfcn</code>ライブラリは実行時、および<code>dlsym()</code>を経由して選ばれた 共有オブジェクト・ライブラリ内の関数を呼び出すためのC++ プログラムのユーザによって選択された共有オブジェクトライブラリへのリンクを動的 のために使用されているC++プログラムで見た

    • 実行時にユーザーがx.soという共有オブジェクトライブラリを選択したとします。 x.soは、extern "C"に囲まれた関数 の定義を持つcppファイルからコンパイルされました。 cppファイルのコメントでは、extern "C"の使用は重要ですが、それ以上の説明はなく、 という説明があり、なぜですか?

    • ここにはC++コードとCコードしかないのは間違いありませんか?だからextern "C"必ずしもはCとC++を混ぜるときに使われる コード一緒にですか?

    • 上記の質問に対して、ライブラリが静的または動的にC++プログラムの問題に関係するかどうかは関係ありませんか?

  2. さて共有オブジェクトライブラリがずっと早く実行時よりも知られている あり、そしてCの作者++プログラム がそれをコンパイルする前dlfcnを使用せずにC++プログラムでそれを指定する単純な場合に比較し、 は、実行時に共有オブジェクトライブラリとC++プログラム を動的にリンクします。この場合、共有オブジェクトライブラリにコンパイルされた cppファイルには `extern" C "がまだ必要ですか?

ありがとうございます。

+0

それは暗黙のようです。 PosixはC仕様であるため、Posix APIの関数ポインタへの参照は、暗黙的にそれらがC言語リンケージを持つ関数へのポインタであると想定しています。しかし、「C言語リンケージ」という用語はC++用語です。 Cの観点からは、他の種類の関数はありません。結論は、C++のC APIを使用するときには、C言語リンケージでのみ関数を使用できることです。 –

+0

あなたの共有ライブラリに 'int foo(int ** x、struct Bar *&y)'があれば簡単ですが、 'extern" C "'は 'dlsym(libhandle、" foo ")' 'dlsym(libhandle、" _Z3fooPPiRP3Bar ")'の代わりに、 'foo'の何らかのmanglingがあなたのプラットフォーム上で今週実施されています。実際のCコードは必要ありません。 –

答えて

3

extern "C"は、リンケージを変更し、名前のマングリングに影響します。 What is name mangling, and how does it work?

コンパイルされたオブジェクトのエクスポートされた名前は、通常はマングルされます。つまり、Cからは使用できません。つまり、dlsym()で検索すると、名前が変更された名前を使用する必要があります。

ここにはC++コードとCコードしかないのは間違いありませんか? CとC++のコードを一緒に混ぜるときにextern "C"を必ずしも使用する必要はありませんか?

ここでの意味は不明です。 C++をコンパイルしている場合、この段階ではC++コードのみが使用されます。 C言語で記述されたモジュールと何らかの方法でリンクしている場合は、Cが関与します。外部CライブラリまたはプログラムがC++定義の関数にリンクする必要がある場合は、extern "C"と宣言する必要があります。

上記の質問に対して、dlfcnライブラリが静的または動的にC++プログラムにリンクされているかどうかは関係ありますか?

いいえ(おそらくあなたはそれが重要と思われる理由を説明しているはずです)。

は今、共有オブジェクトライブラリがずっと早く実行時よりも知られている単純な場合に比較して、C++プログラムの作者は、それをコンパイルする前にDLFCN使用せずにC++プログラムでそれを指定して、動的にリンク共用オブジェクト・ライブラリーおよびC++プログラムを実行時に実行します。この場合、共有オブジェクトライブラリにコンパイルされたcppファイルで `extern" C "はまだ必要ですか?

シンボルの宣言されたリンケージは、2つのC++モジュールで一貫している必要があります。確かに、モジュールが両方ともC++の場合はextern "C"を削除できます。しかし、1つのモジュールがextern "C"とシンボルを宣言している場合は、もう1つのシンボルも必要です。

+0

ありがとうございます。ここにはC++コードとCコードしかないのは正しいですか? extern "C"は必ずしもCとC++のコードを混在させるときに**使われるだけではありませんか? – Tim

+0

@Tim 'extern" C "の使用目的は、一般にあなたのコードをC言語で書かれたコード(あるいはC言語を使うことができる別の言語)とリンクするためのものです。もちろんそうでない場合は、あなたがそれを使用するのを防ぐことは何もありません。 'dlsym'を使いやすくしました(更新ごとに)。 – davmac

+0

メインプログラムはC++で書かれており、 'dlfcn'ライブラリを呼び出して実行時に決定される共有オブジェクトライブラリ' x.so'の関数を呼び出します。メインプログラムの 'dlfcn'ライブラリと' x.so'はコンパイル後にすべて機械語で書かれています。 CコードとCコードとC++コードが混在していないようです。 'dlfcn'ライブラリがCファイルからコンパイルされていて、' x.so'とメインプログラムがcppファイルからコンパイルされていることは問題ではないということは間違いありません。 – Tim

関連する問題