[お知らせ] Microsoft の "Developer Network (日本語)" で "プロジェクト名_EXPORTS"定数の未定義について指摘した ところ、日曜日(2017.10.08)の朝だというのに40分未満で適切な内容の返信が投稿され、 Microsfotの開発チームへの報告 が動画付きで上がりました。優秀な技術者、恐るべし。
プロジェクトの名前を入力してから、"OK" を選択します。
[注意] このバグは Oct/11/2017 にリリースされた Visual Studio 2017 version 15.4 で解決されています。
DLL のプロジェクトには "プロジェクト名.h" と "プロジェクト名.cpp" というファイルが含まれています。これらを Example.h と Example.cpp として説明します。
Example.h |
#ifdef EXAMPLE_EXPORTS #define EXAMPLE_API __declspec(dllexport) #else #define EXAMPLE_API __declspec(dllimport) #endif class EXAMPLE_API CExample { public: CExample(void); }; extern EXAMPLE_API int nExample; EXAMPLE_API int fnExample(void); |
Example.cpp (初期状態) |
#include "stdafx.h" #include "Example.h" EXAMPLE_API int nExample=0; EXAMPLE_API int fnExample(void) { return 42; } CExample::CExample() { return; } |
[1]の場合は、Visual Studio が EXAMPLE_EXPORTS を定義してコンパイルするので、Example.cpp の EXAMPLE_API は __declspec(dllexport) として扱われます。
[2]の場合は、 EXAMPLE_EXPORTS が定義されない状態でコンパイルするので、 Example.h の中の EXAMPLE_API は __declspec(dllimport) として扱われます。
すなわち、[1], [2] どちらの場合でも同じ Example.h が使えるという便利な状況になっているわけです。
Example.cpp (バグ対処後) |
#include "stdafx.h" #ifndef EXAMPLE_EXPORTS #define EXAMPLE_EXPORTS #endif #include "Example.h" EXAMPLE_API int nExample=0; EXAMPLE_API int fnExample(void) { return 42; } CExample::CExample() { return; } |