2010-01-16 44 views
9

C++出口類我想知道如果(__declspec(dllexport)的在VC++)的出口是一種標準(ANSI,ISO,...)
我想知道的如果有人已經嘗試做與英特爾C++編譯器和GCC(在Windows MinGW的)相同,如果有可能混合使用不同的編譯器生成的DLL(我很懷疑,這是可能的)可以從DLL

THX

+0

這個問題背後的想法是能夠跨越不同系統(win,linux,* bsd)編譯代碼,但要在Windows上開發(我喜歡visual studio及其提供的工具(甚至更多並行工具可用!!)),並用mingw和msvc在windows上快速編譯它,以檢查代碼「看上去」是否正常。這將使端口更快,更容易 – user246456 2010-01-16 01:43:05

回答

9

不,__declspec是VC++特有的。

默認情況下,VC++需要的一個原因是DLL不會在DLL之外公開符號,除非明確要求這樣做。在Posix上,共享對象會公開所有(非靜態)符號,除非明確告知隱藏它們。

更新

此基礎上,你想使你的代碼移植您的評論

,你要使用的預處理,做這樣的事情:

#ifdef WIN32 
    #ifdef EXPORT_CLASS_FOO 
    #define CLASS_FOO __declspec(dllexport) 
    #else 
    #define CLASS_FOO __declspec(dllimport) 
    #endif 
#else 
    #define CLASS_FOO 
#endif 

class CLASS_FOO foo 
{ ... }; 

在項目實施類,請確保將EXPORT_CLASS_FOO添加爲預處理器定義(可在C/C++ |預處理器|預處理定義下的Project | NAME Properties中找到)。這樣,在構建DLL時將導出它們,在使用DLL時導入它們,並且在Unix下不做任何特殊處理。

+0

這是否意味着我們可以導出一個類並立即重用它?它是系統特定的(POSIX)還是編譯器(Linux上的intel C++提供相同的行爲) – user246456 2010-01-16 01:35:25

+0

它取決於Intel C++或gcc上的編譯器標誌,但默認爲公開符號。只需製作一些預處理宏,以便可以有條件編譯這種導出。 – 2010-01-16 01:56:38

+0

R塞繆爾我們如何在posix共享對象中隱藏一個類? – 2011-06-25 12:46:58

2

任何以C++開頭的東西都是特定於供應商的擴展。我不知道其他編譯器廠商是否支持這一點,但它肯定是不兼容的交叉編譯器。

+0

+1,儘管我確實相信MinGW支持這個特定的微軟擴展,使移植代碼更容易。與VC++不同,MinGW不需要它。 – 2010-01-16 01:24:37

2

DLL的概念是非常特定於平臺的。它沒有被任何遠程通用標準覆蓋。如果事實上,首字母縮略詞DLL本身通常保留給Windows動態庫。無需添加,在C/C++中特定於DLL支持的任何東西都非常依賴於平臺/供應商。

+1

其實OS2也使用DLL。但它曾經是MS和IBM之間的共享代碼...... :-) – 2010-01-16 05:15:11

4

現在可以使用GCC編譯器/鏈接器堆棧僅從DLL [在Windows]或SO [在* nix]上導出某些符號[類/ API]。有關如何執行此操作的相當好的概述,請參閱http://gcc.gnu.org/wiki/Visibility

相關問題