嘿,我有一些關於Windows DLL的快速問題。在Windows上DLL導出/導入和Extern問題
基本上我使用ifdefs來處理dllexport和dllimport,我的問題實際上是關於dllexports和dllimports以及extern關鍵字的位置。
我將dllimports/dllexports放在頭文件中,但是我必須將dllexport和dllimports放在實際的定義上嗎?
typedefs怎麼樣?
我把dllimport/dllexport放在前面嗎?在
dllexport typedef map<string, int> st_map
另外,關於extern關鍵字我已經看到了正在使用的是這樣的:
extern "C" {
dllexport void func1();
}
我也看到了它正在使用這樣的:
extern dllexport func1();
其中包括「C」和其他沒有,我的問題是什麼區別,我需要使用它?如果我這樣做,那麼我是否將它用於dllexport和dllimport,我也必須在頭文件聲明和定義中使用它嗎?
我的項目將是共享庫,它包含我想導出的幾個類文件,我想導出的一些typdefs以及一些全局函數,我也想將它們全部導出到dll中。
有人請賜教嗎?
編輯:
好吧,我想我會後我做了什麼小的提取物,也請注意,我爲構建Linux和Windows庫,所以我該做的檢查:
源代碼mydll.h
#ifdef WINDOWS
# ifdef PSTRUCT_EXPORT
# define WINLIB __declspec(dllexport)
# else
# define WINLIB __declspec(dllimport)
# endif
#else
# define WINLIB
#endif
WINLIB void funct1();
現在:
mydll.cpp
#define PSTRUCT_EXPORT
void funct1() <---- do i need to add WINLIB in front of it?
Or is doing it in the header enough?
好,我已經得到的東西,除了extern關鍵字位非常相似。我在我所有的類文件中定義了類似的宏。 那麼extern被用來爲C編譯器提供支持嗎?我的項目主要是C++ – 2009-09-17 19:54:41
我還需要在定義中添加dllimport/export語句嗎? – 2009-09-17 21:54:25
你需要爲extern「C」的東西的唯一原因是,如果你想從C代碼鏈接C++函數。基本上,你可以忽略外部「C」的東西,直到你得到鏈接器錯誤。 – 2009-09-18 01:29:19