7

C++ でいくつかの共有ライブラリを作成する必要があり、開発者のオペレーティング システムとして Linux を使用しました。dlsym/を介してシンボルをロードする場合は、シンボルを表示する必要があることを知っていますLoadLibrary。したがって、Linux では、すべてのシンボルが次のパターンに従いました。

extern "C" [[gnu::visibility("default")]] void f();

C++11 を有効にして clang を使用したところf、ホスト プログラムに読み込むことができました。Windows に移行したとき、C++11 を有効にして GCC 4.8.2 を使用し、そのパターンは Windows マシンでも動作しましたLoadLibrary。(新しい属性構文には C++11 を使用する必要がありました)。__declspec(dllexport)Windows では、共有ライブラリからシンボルをエクスポートするために使用する必要があることを知っています。ならどうしよう?__declspec(dllexport)もう必要ありませんか?

編集:

ここで、それらは同義語であることがわかりました(私は思います)ので、特定のターゲットにマクロと s を使用しないようにする[[gnu::attribute]]ための理由はありますか?__declspec(dllimport)ifdef

4

1 に答える 1

4

シンボルの可視性は - とは微妙に異なりdllexportます。主な理由は.dll、Windows でmingw/の下で をコンパイルすると、リンカcygwinのデフォルトの動作がオプションになるためです。つまり、デフォルトですべてのものを自動エクスポートします。-export-all-symbols.dll

この動作は、.defファイルを使用する__declspec((dllexport))__attribute((dllexport))任意のルーチンに配置することで変更できます (つまり、単一のシンボルをエクスポートするように指定した場合、エクスポートと宣言されたシンボルのみがエクスポートされます)。これにより、ライブラリに多数のシンボルがある場合、dll の読み込み時にパフォーマンスが大幅に向上する可能性があります。

同等のC++属性を使用する場合は、次を使用します[[gnu::dllexport]]

そうです、世界をエクスポートしないようにするために使用dllexportしてください。.dll

同様の方法で、[[gnu:dllimport]]外部ルーチンのインポートに使用できます。

ドキュメントを読むときは注意してください。実際に言っていることは、属性を使用すると、オーバーライドされない限りdllexport、動作もトリガーされるということです。visibility:default

于 2014-09-09T13:34:15.433 に答える