- ベストアンサー
DLLとインポート、エクスポートの使い方
- DLLとはWin32 Dynamic-Link Libraryのことで、ExeとはWin32 Applicationのことです。
- DLLを使用する場合、DLLのヘッダファイルにエクスポートしたい関数を指定し、Exe側ではインポートを指定します。
- ビルドする際に「外部シンボルが未解決です」というエラーが発生する場合、リンクの設定やファイルの配置を確認する必要があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
別々でもできますよ その際に 関数宣言が extern "C"{ } の{}内にある必要があります DLL側 #ifdef __cplusplus extern "C" { #endif __declsepc(dllexport) void exportmain(); #ifdef __cplusplus } #endif EXE側 #ifdef __cplusplus extern "C" { #endif __declsepc(dllimport) void exportmain(); #ifdef __cplusplus } #endif といった具合です extern "C"でC++の関数自動修飾を抑制していないためにおきている現象だと思いますよ > 外部シンボル ~~ 未解決です といったメッセージに exportmain@.... といったメッセージがあると思います @以降が コンパイラが勝手につけた名前になります C++の場合型情報などをこの修飾名に持たせて同名関数で引数が違うものなどを識別します MSDNで『リンケージ仕様』などを参照してみてください
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
DLLやEXEを開発しているソースが CPPならば CPPの関数名修飾を抑制するようにしないといけにかと思います ヘッダーを #ifdef MYEXPORT #define MYAPI _declspec(dllexport) #elee #define MYAPI _declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif MYAPI void exportmain(); #ifdef __cplusplus } #endif といった具合に extern "C" で関数宣言をくくってみましょう 上記の例ではDLLを生成する場合は MYEXPORTをマクロ定義して使います EXE側では MYEXPORTをマクロ定義『しない』で使います
お礼
回答ありがとうございます。 教えていただいたもので1つのヘッダに記載したらうまくいきました。 しかし、元々別々のヘッダでエクスポート、インポートをしていたのですがそちらだとextern "C"を入れてもいくとうまくいきません。 別々というのは、DLLとEXEでそれぞれ違うヘッダを使用しDLLではエクスポートだけし、EXEの方のヘッダでインポートだけをしています。 回答いただいたような1つのヘッダでマクロで分けるようにするとうまくいくのですが、別々のヘッダに書くのはなにかしら仕様的にダメなのでしょうか? お時間ありましたらぜひ回答をお願いします。
お礼
再度の回答ありがとうございます。 ヘッダ1つバージョンも別々バージョンもMFCとWin32APIでの作成と使用するのもできました。 とても助かりました、本当にありがとうございます。