2015-11-01 111 views
-1

我正在使用多个项目(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:使用未定义的类型 '标头'

我在做什么错?有任何想法吗?

回答

1

您收到的错误消息是编译器错误(不是链接器错误!)。 您需要在首次使用之前定义Header

您可以将struct DllExport Header { ... };移动到单独的头文件(例如Dll.h),然后在Exe.cpp中输入#include "Dll.h"

1

您需要将自定义类型导出到标题中,以便您的.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的预处理器标志。

+0

为了补充说明,Visual Studio在构建libname项目时自动添加libname_EXPORTS定义。您可以使用#ifdef为DLL_EXPORT选择正确的值。 – arrowd