c語言邊角料5:一個跨平臺的頭文件
時間:2021-11-05 14:09:36
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]一、前言二、頭文件三、預定義的宏四、Windows平臺場景分析五、Linux平臺場景分析一、前言我們平常在寫代碼的時候,特別是在制造輪子的時候(為別人提供庫文件),會遇到各種不同的需求場景:有些人需要在Linux系統(tǒng)下使用,有些人需要在Windows系統(tǒng)下使用;有些人使用C語言開...
-
一、前言
-
二、頭文件
-
三、預定義的宏
-
四、Windows 平臺場景分析
-
五、Linux 平臺場景分析
一、前言
我們平常在寫代碼的時候,特別是在制造輪子的時候(為別人提供庫文件),會遇到各種不同的需求場景:
特別是在 Windows 系統(tǒng)中,庫文件中導出的函數(shù)需要使用 _declspec(dllexport) 來聲明函數(shù),而使用者在導入的時候,需要使用 _declspec(dllimport) 來聲明函數(shù),甚是麻煩!
- 有些人需要在 Linux 系統(tǒng)下使用,有些人需要在 Windows 系統(tǒng)下使用;
- 有些人使用 C 語言開發(fā),有些人使用 C 來開發(fā);
- 有些人使用動態(tài)庫,有些人使用靜態(tài)庫;
二、頭文件
先直接上代碼,可以先試著分析一下,后面我們再逐一分析不同的使用場景。
下面是頭文件:
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
#define MY_WIN32
#elif defined(linux) || defined(__linux) || defined(__linux__)
#define MY_LINUX
#endif
#if defined(MY_WIN32)
#ifdef MY_API_STATIC
#ifdef __cplusplus
#define MY_API extern "C"
#else
#define MY_API
#endif
#else
#ifdef MY_API_EXPORTS
#ifdef __cplusplus
#define MY_API extern "C" __declspec(dllexport)
#else
#define MY_API __declspec(dllexport)
#endif
#else
#ifdef __cplusplus
#define MY_API extern "C" __declspec(dllimport)
#else
#define MY_API __declspec(dllimport)
#endif
#endif
#endif
#elif defined(MY_LINUX)
#ifdef __cplusplus
#define MY_API extern "C"
#else
#define MY_API
#endif
#endif
三、預定義的宏
假設需要寫一個庫文件,提供給別人使用。定義了上面這個頭文件之后,其他的文件中都要 include 這個頭文件。
1. 平臺宏定義
不同的平臺預定義了相應的宏定義,例如:
Windows 平臺:WIN32, _WIN32, WIN32;在一個確定的平臺上,這些宏不一定全部定義,很可能只有其中的某一個宏是被定義的。
Linux 平臺:linux, __linux, linux;
2. 編譯器宏定義
如果在寫庫代碼的時候,使用的是 C ,而使用者使用的是 C 語言,那么就需要對庫函數(shù)進行 extern “C” 聲明,讓編譯器不要對函數(shù)的名稱進行改寫。
四、Windows 平臺場景分析
1. 編譯生成庫文件
(1) 生成靜態(tài)庫
gcc 編譯器:#define MY_API(2) 生成動態(tài)庫
g 編譯器:#define MY_API extern "C"
gcc 編譯器:#define MY_API __declspec(dllexport)g 編譯器:#define MY_API extern "C" __declspec(dllexport)
2. 使用庫
在使用庫的應用程序中,也需要在代碼中 include 這個頭文件,然后加上編譯選項中定義的各種宏,來生成對應的MY_API宏定義。
gcc 編譯器:#define MY_API(2) 使用動態(tài)庫
g 編譯器:#define MY_API extern "C"
gcc 編譯器:#define MY_API extern "C" __declspec(dllimport)這樣就相當于聲明導入庫函數(shù)了。g 編譯器:#define MY_API __declspec(dllimport)
五、Linux 平臺場景分析
Linux 平臺下就簡單多了,只需要注意編譯器的問題,而沒有導出和導入之分。