3

私はLinuxで多くのプログラミングを行っており、可視性属性を使用して、シンボルが共有オブジェクトで表示されるか非表示になるかを定義しています。わかりやすくするために、シンボルが表示されている場合は外部からアクセスでき(共有オブジェクトにリンクしている人)、非表示の場合は内部でのみ使用されることになっています。

Windowsでは、動作が少し異なるように見えます。エクスポート(シンボルは共有オブジェクトでここに定義されており、これにリンクしている人がアクセスできます)とインポート(ここでは共有オブジェクトにリンクしていて、シンボルがエクスポートされます)で動作します。そこに)シンボル。しかし、ここでのみ使用する必要があるため、つまり、誰かがシンボルとリンクしている場合にリンカーエラーが予想されるため、シンボルをエクスポートしないようにコンパイラーに指示する方法が見つかりませんでした。

私の質問は、シンボルを「非表示」(Linuxのgccのように)として定義できるかどうか、そしてその方法です。また、Windowsのトピックでのこのすべての可視性は私にとって少し曖昧であり、すべてがどのように機能するかをよりよく理解するために、さらにいくつかの読書リンクを探していました。

4

1 に答える 1

7

David Rodriguez は正しいです。MSVC 環境では、プログラマは通常、MSVC 固有の__declspec(dllexport)修飾子を介して関数/クラス シンボルを明示的にエクスポートします。明示的にエクスポートされていないシンボルは、コンパイルされた DLL のシンボル テーブルに表示されません ( Visual Studio コマンド ライン ユーティリティの 1 つであるdumpbinを使用して、 /EXPORTS オプションを使用して確認できます)。そのシンボルをインポートするときに dllimport を使用するのが慣例ですが、これはオプションだと思います。これが通常どのように行われるかというと、DLL のパブリック インターフェイスを定義するヘッダー ファイルには、デフォルトで __declspec(dllimport) に展開されるマクロが含まれますが、ライブラリのビルド中には __declspec(dllexport) に展開されるように設定されます。

GCC と MSVC が dllexport を処理する方法は異なる場合があることに注意してください。おそらくGCCは、エクスポートされていないシンボルを隠すという意味でdllexportを「尊重」していませんか?最初に MSVC でコンパイルを試み、その結果を dumpbin でテストしてから、GCC で同じことを試します。Visual Studio をお持ちでない場合でも、VS Express をダウンロードするか、(あまり知られていませんが) コマンド ライン MSVC に同梱されている特定の .NET 再頒布可能ファイルをダウンロードすることで、MSVC コンパイラを入手できます (これらのオプションはどちらも無料で合法です)。ここでは、ダンプビンを取得できるので、VS Express を選択することをお勧めします。

于 2012-10-03T23:22:04.097 に答える