__declspec(dllexport)自定义类型变量
问题描述:
我正在使用多个项目(Visual Studio 2013)的Visual Studio解决方案。一个项目用于生成.dll
文件,其他项目使用该.dll
文件并生成.exe
文件。当我导出标准类型变量时,一切正常。但如果我想使用我的自定义类型,我得到一个编译错误。这是当我使用qHead
在我Exe.cpp
我得到在该行编译错误为例__declspec(dllexport)自定义类型变量
// Dll.cpp
#define DllExport __declspec (dllexport)
DllExport int maxPackSize = 20;
// my custom type
struct DllExport Header
{
int m_data; // some data
};
DllExport Header qHead = { 100 };
// Exe.cpp
#define DllImport __declspec (dllimport)
DllImport extern int packetSize; // OK
struct DllImport Header;
DllImport extern Header qHead; // leads to an error
。错误就像
错误C2027:使用未定义的类型 '标头'
我在做什么错?有任何想法吗?
答
您收到的错误消息是编译器错误(不是链接器错误!)。 您需要在首次使用之前定义Header
。
您可以将struct DllExport Header { ... };
移动到单独的头文件(例如Dll.h
),然后在Exe.cpp
中输入#include "Dll.h"
。
答
您需要将自定义类型导出到标题中,以便您的.exe可以看到类型。例如,
Dll.h
#ifdef EXPORT_SYMBOLS
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT __declspec(dllimport)
#endif
struct DLL_EXPORT Header
{
int m_data;
};
Exe.cpp
你需要使正确的__declspec宏切换到加EXPORT_SYMBOLS
到DLL的预处理器标志。
为了补充说明,Visual Studio在构建libname项目时自动添加libname_EXPORTS定义。您可以使用#ifdef为DLL_EXPORT选择正确的值。 – arrowd