XXX_EXPORTS宏
XXX_EXPORTS
宏是由Visual Studio 2015編譯器自動生成的。這個宏用于標識當前項目是一個導出符號的動態(tài)鏈接庫(DLL)項目。在使用Visual Studio 2015創(chuàng)建Win32項目時,編譯器會自動添加這個宏到項目的預定義宏中。
這個宏的作用是在編譯過程中幫助標識導出符號,以便在動態(tài)鏈接庫中正確地導出和導入函數(shù)和變量。通過使用這個宏,可以確保在編譯和鏈接過程中正確處理動態(tài)鏈接庫的導出和導入。
如果你使用Visual Studio 2015創(chuàng)建了一個Win32項目,并且看到了XXX_EXPORTS
宏,那么你可以在代碼中使用它來標識需要導出的函數(shù)和變量。例如,在導出函數(shù)時,可以使用宏來定義函數(shù)的導出修飾符。
請注意,這個宏的名稱可能會因為項目的不同而有所變化,例如XXX_EXPORTS
宏可能會根據(jù)項目名稱和項目類型而有所不同。因此,如果你在不同的項目中使用Visual Studio 2015創(chuàng)建項目,可能會看到不同的宏名稱。
要在編譯和鏈接過程中正確處理動態(tài)鏈接庫的導出和導入,可以使用這個宏來標識需要導出的函數(shù)和變量,并使用適當?shù)膶С鲂揎椃?/p>
在使用Visual Studio 2015創(chuàng)建的Win32項目中,可以按照以下步驟來使用這個宏:
- 在需要導出的函數(shù)和變量的聲明前添加宏定義。例如:
#ifdef XXX_EXPORTS
#define XXX_API __declspec(dllexport)
#else
#define XXX_API __declspec(dllimport)
#endif
XXX_API void MyExportedFunction();
- 在需要導出的函數(shù)和變量的定義處使用宏。例如:
XXX_API void MyExportedFunction()
{
// 函數(shù)實現(xiàn)
}
- 在項目的屬性設置中,確保已正確配置導出符號??梢园凑找韵虏襟E進行設置:
- 右鍵單擊項目,選擇“屬性”。
- 在屬性頁中,選擇“配置屬性” > “C/C++” > “預處理器”。
- 在“預處理器定義”一欄中,添加宏定義XXX_EXPORTS。
這樣,在編譯和鏈接過程中,編譯器會根據(jù)宏的定義來正確處理導出和導入符號。在生成動態(tài)鏈接庫時,導出的函數(shù)和變量將被標記為可供其他模塊使用。在使用動態(tài)鏈接庫的其他項目中,可以使用相同的宏來導入這些函數(shù)和變量。
__declspec(dllexport) 和 __declspec(dllimport) 的區(qū)別
__declspec(dllexport)和__declspec(dllimport)是用于在Windows平臺上定義動態(tài)鏈接庫(DLL)中的函數(shù)和變量的關(guān)鍵字。
__declspec(dllexport)用于在DLL中定義函數(shù)或變量,并將其標記為可供其他模塊使用。這將使函數(shù)或變量在DLL中可見,并可以被其他模塊調(diào)用或引用。
__declspec(dllimport)用于在使用DLL的模塊中聲明函數(shù)或變量。它告訴編譯器該函數(shù)或變量是在DLL中定義的,并且在鏈接時需要從DLL中導入。
因此,__declspec(dllexport)用于定義DLL中的函數(shù)或變量,而__declspec(dllimport)用于在使用DLL的模塊中聲明函數(shù)或變量。
需要注意的是,這些關(guān)鍵字只在Windows平臺上有效,并且在其他平臺上沒有相應的等效物。
MSDN里面的解釋:
不使用 __declspec(dllimport) 也能正確編譯代碼,但使用 __declspec(dllimport) 使編譯器可以生成更好的代碼。編譯器之所以能夠生成更好的代碼,是因為它可以確定函數(shù)是否存在于 DLL 中,這使得編譯器可以生成跳過間接尋址級別的代碼,而這些代碼通常會出現(xiàn)在跨 DLL 邊界的函數(shù)調(diào)用中。但是,必須使用 __declspec(dllimport) 才能導入 DLL 中使用的變量。
dllimport是為了更好的處理類中的靜態(tài)成員變量的,如果沒有靜態(tài)成員變量,那么這個__declspec(dllimport)無所謂!!!!!!!
導出dll中的函數(shù)為什么要加extern “C”
在C++中,函數(shù)的名稱會被編譯器進行名稱修飾(name mangling),以便支持函數(shù)重載和其他C++特性。這種名稱修飾會導致函數(shù)在編譯后的二進制代碼中的名稱發(fā)生變化。
當我們將函數(shù)導出為動態(tài)鏈接庫(DLL)時,我們希望函數(shù)的名稱在二進制代碼中保持不變,以便其他程序可以正確地調(diào)用這些函數(shù)。為了實現(xiàn)這一點,我們需要使用extern "C"語法來告訴編譯器不要對函數(shù)名稱進行修飾。
extern "C"告訴編譯器使用C語言的命名約定來處理函數(shù)名稱,這樣函數(shù)的名稱就不會被修飾,而是保持原樣。這樣,其他程序就可以按照C語言的方式來調(diào)用這些函數(shù),而不需要關(guān)心C++的名稱修飾。文章來源:http://www.zghlxwxcb.cn/news/detail-613984.html
因此,當我們將函數(shù)導出為DLL時,為了確保函數(shù)的名稱在二進制代碼中保持不變,我們需要使用extern "C"來告訴編譯器不要對函數(shù)名稱進行修飾。文章來源地址http://www.zghlxwxcb.cn/news/detail-613984.html
總結(jié):dll庫中統(tǒng)一引用的頭文件(UserDllDef.h)
#ifndef _USER_DLL_DEF_H_
#define _USER_DLL_DEF_H_
#ifndef USER_EXTERN_C
#if (defined(__cplusplus) || defined(__cplusplus__))
#define USER_EXTERN_C extern "C"
#else
#define USER_EXTERN_C
#endif // __cplusplus || __cplusplus__
#endif // USER_EXTERN_C
#ifndef _USER_DLL_DEF_H_
#define _USER_DLL_DEF_H_
#ifndef USER_EXTERN_C
#if (defined(__cplusplus) || defined(__cplusplus__))
#define USER_EXTERN_C extern "C"
#else
#define USER_EXTERN_C
#endif // __cplusplus || __cplusplus__
#endif // USER_EXTERN_C
#ifdef DLL_EXPORTS
#if defined(_WIN32)
#define DLL_API USER_EXTERN_C __declspec(dllexport)
#else
#define DLL_API USER_EXTERN_C __attribute__((visibility("default")))
#endif
#else
#if defined(_WIN32)
#define DLL_API USER_EXTERN_C __declspec(dllimport)
#else
#define DLL_API USER_EXTERN_C __attribute__((visibility("default")))
#endif
#endif // DLL_EXPORTS
#endif // _USER_DLL_DEF_H_
到了這里,關(guān)于Visual Studio 2015編譯器 自動生成 XXX_EXPORTS宏的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!