2015-10-02 48 views
1

我有一個在兩個項目(桌面應用程序項目和庫項目(dll))之間共享的通用實用程序類。我正在VS2013下工作。如何聲明庫和應用程序之間共享的類

爲了使這個類提供給外部呼叫時,它編譯爲我的圖書館的一部分,我使用宏是這樣的:

#include "global.h" 

class MYCLASS_EXPORT UtilityClass { 

public: 
... 

我global.h文件包含以下內容:

#ifdef MYCLASS_LIBRARY 
# define MYCLASS_EXPORT __declspec(dllexport) 
#else 
# define MYCLASS_EXPORT __declspec(dllimport) 
#endif 

因此,當我在庫中使用該類時,我設置了預處理器宏MYCLASS_LIBRARY,並且鏈接我的庫的應用程序可以使用UtilityClass。當我使用該類作爲我的C++桌面應用程序項目的一部分(它沒有預處理器宏MYCLASS_LIBRARY)時,由於MYCLASS_EXPORT聲明,我從編譯器中得到「不一致的dll連接」錯誤。

那麼,如何聲明我的類,以便既可以在庫項目中也可以在桌面應用程序項目中使用(因此不需要導出該類)?

只是爲了更清楚,我已經找到了一個可行的解決方案如下:

#ifdef MYCLASS_LIBRARY 
#include "global.h" 
#endif 

#ifdef MYCLASS_LIBRARY 
    class MYCLASS_EXPORT UtilityClass { 
#else 
    class UtilityClass { 
#endif 

    public: 
    ... 

現在一切都編譯並運行良好,但似乎並沒有一個很好的辦法......

+0

確保沒有爲多個項目設置鏈接器標記「-DMYCLASS_LIBRARY」。 – AndyG

+0

應用程序項目根本沒有定義它,它只是在庫預處理器宏中定義的 – ABCplus

+0

您是否在cpp定義中定義了任何子類/結構或使用靜態變量? 應用程序編譯中是否包含cpp/class定義? –

回答

0

我可以考慮以下選項:

在桌面應用程序,定義一個宏,MYCLASS_STATIC和更改.h文件中使用:

#ifdef MYCLASS_STATIC 
    # define MYCLASS_EXPORT 
#elif defined(MYCLASS_LIBRARY) 
    # define MYCLASS_EXPORT __declspec(dllexport) 
#else 
    # define MYCLASS_EXPORT __declspec(dllimport) 
#endif 
+0

你的意思是「庫應用程序」,而不是「桌面申請「爲第1點? – ABCplus

+0

查看已更新的答案。 –

相關問題