2015-11-01 144 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