訂閱
糾錯
加入自媒體

頭文件+宏,完美解決聲明函數(shù)問題!

2021-03-30 16:41
道哥分享
關注

2. 編譯器宏定義

如果在寫庫代碼的時候,使用的是 C++,而使用者使用的是 C 語言,那么就需要對庫函數(shù)進行 extern “C” 聲明,讓編譯器不要對函數(shù)的名稱進行改寫。

編譯器 g++ 預定義了宏 __cplusplus,因此,在頭文件中,就利用了這個宏,在 MY_API 中添加 extern "C" 聲明。

四、Windows 平臺場景分析

 1. 編譯生成庫文件

(1) 生成靜態(tài)庫

在靜態(tài)庫中,不需要 __declspec(dllexport/dllimport) 的聲明,因此只需要區(qū)分編譯器即可(gcc or g++),在編譯選項中定義宏 MY_API_STATIC,即可得到最終的 MY_API 為:

gcc 編譯器:#define MY_API  
g++ 編譯器:#define MY_API extern "C"  

(2) 生成動態(tài)庫

在編譯選項中,定義宏 MY_API_EXPORTS,這樣最終得到的 MY_API 就會變成:

gcc 編譯器:#define MY_API __declspec(dllexport)

g++ 編譯器:#define MY_API extern "C" __declspec(dllexport)

2. 使用庫

在使用庫的應用程序中,也需要在代碼中 include 這個頭文件,然后加上編譯選項中定義的各種宏,來生成對應的 MY_API 宏定義。

(1) 使用靜態(tài)庫

需要在編譯選項中定義 MY_API_STATIC,即可得到最終的 MY_API 為:

gcc 編譯器:#define MY_API
g++ 編譯器:#define MY_API extern "C"

(2) 使用動態(tài)庫

在編譯選項中不需要任何宏定義,即可得到最終的 MY_API 為:

gcc 編譯器:#define MY_API extern "C" __declspec(dllimport)

g++ 編譯器:#define MY_API __declspec(dllimport)

這樣就相當于聲明導入庫函數(shù)了。

五、Linux 平臺場景分析

Linux 平臺下就簡單多了,只需要注意編譯器的問題,而沒有導出和導入之分。


<上一頁  1  2  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

    掃碼關注公眾號
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯
    x
    *文字標題:
    *糾錯內(nèi)容:
    聯(lián)系郵箱:
    *驗 證 碼:

    粵公網(wǎng)安備 44030502002758號