2010-11-25 15 views
4

私はビルドシステムとしてCMakeを使用する共有ライブラリを持っています。 Linuxマシン上でGCCを使って正常にコンパイルされます。今、私は窓でコンパイルしようとしています。 MSVCは指定されるまでシンボルをエクスポートしません。私は__declspec(dllexport)を知っています。しかし、CMake wikiで提供されている例は混乱しています。次のコードを考慮してください。DLLのコンパイル時にシンボルをエクスポートする - MSVC

#if defined (_WIN32) 
    #if defined(MyLibrary_EXPORTS) 
    #define MYLIB_EXPORT __declspec(dllexport) 
    #else 
    #define MYLIB_EXPORT __declspec(dllimport) 
    #endif /* MyLibrary_EXPORTS */ 
#else /* defined (_WIN32) */ 
#define MYLIB_EXPORT 
#endif 

私は__declspec(dllexport)を理解しますが__declspec(dllimport)が使用されている理由を不思議?どのように私はこれを使用するのですか?それはMYLIB_EXPORT void function()のようですか?

私はfoo()という名前のC関数を持っているとします。これは内部的にいくつかのstatic関数を使用します。エクスポートするときに、静的関数もエクスポートする必要がありますか?それとも、APIの一部であるエントリ関数だけをエクスポートするだけで十分ですか?

ご協力いただければ幸いです。

答えて

5

APIの一部であるエントリ関数のみをエクスポートするだけで十分です。静的関数をエクスポートする必要はありません。

また、関数に__declspec(dllimport)を使用する必要はありません。データにのみ必要です。 Windowsは自動的に関数のインポートを行います。

以下のリンクを参考にすることができ:一般的にコンパイルするためのライブラリで、そのクライアントの両方で使われているヘッダファイルのために使われています

http://msdn.microsoft.com/en-us/library/ms235636(VS.80).aspx

http://msdn.microsoft.com/en-us/library/ms682589(VS.85).aspx

+0

ありがとうございました –

1

。ライブラリにヘッダーをインクルードするときにMyLibrary_EXPORTSを定義し、シンボルをエクスポートします。ヘッダーをクライアントアプリケーションに組み込むと、ヘッダーがインポートされます。

いいえ、APIエントリポイントをエクスポートするだけで済みます。静的関数をエクスポートする必要はありません。

+0

ありがとう –

関連する問題