動(dòng)態(tài)庫(kù)關(guān)鍵字:__declspec(dllexport)和__declspec(dllexport)

最近在學(xué)習(xí)OSG庫(kù)的時(shí)候發(fā)現(xiàn)隨便打開一個(gè)頭文件,每個(gè)類的聲明中類名之前都會(huì)插入一個(gè)宏定義OSG_EXPORT

class OSG_EXPORT MatrixTransform : public Transform

查看這個(gè)宏定義主要涉及到兩個(gè)dll文件的關(guān)鍵字__declspec(dllexport)__declspec(dllexport)

    #  if defined( OSG_LIBRARY_STATIC )
    #    define OSG_EXPORT
    #  elif defined( OSG_LIBRARY )
    #    define OSG_EXPORT   __declspec(dllexport)
    #  else
    #    define OSG_EXPORT   __declspec(dllimport)
    #  endif

一番查找資料后總結(jié)如下:

頭文件的作用

  • 首先要知道我們?yōu)槭裁匆褂妙^文件?
  • 頭文件可以理解為是C++的接口文件亭敢,我們?cè)诰幾g這個(gè)工程的時(shí)候不僅需要它的cpp文件還需要頭文件,并且在我們給其他工程鏈接完動(dòng)態(tài)庫(kù)后,要想使用動(dòng)態(tài)庫(kù)里方法時(shí)是通過(guò)提供此動(dòng)態(tài)庫(kù)的頭文件的方式#include 動(dòng)態(tài)庫(kù)的頭文件.h
  • 因此頭文件需要區(qū)分是給自己編譯用還要給別人提供方法用

dllexport

  • 字面意思暴露dll中的變量或方法
  • 編譯dll文件的時(shí)候,在dll頭文件聲明的變量名稱前添加dllexport膏燃。表明這些東西可以被其他工程使用燕锥,即是把 dll中的相關(guān)代碼(類预烙,函數(shù),全局變量)暴露出來(lái)為以后其他應(yīng)用程序使用。

dllimport

  • 字面意思插入dll中的變量或方法
  • 是在其他工程需要使用dll內(nèi)相關(guān)內(nèi)容時(shí)使用的關(guān)鍵字颂碘。當(dāng)其他工程要使用dll 內(nèi)部代碼(類邀层,函數(shù)返敬,全局變量)時(shí),只需要在dll頭文件中聲明的變量名稱前添加dllimport關(guān)鍵字即可,作用是把dll中的相關(guān)代碼插入到應(yīng)用程序中寥院。

_declspec(dllexport)_declspec(dllimport)是相互呼應(yīng)劲赠,只有在dll內(nèi)部用dllexport作了聲明,才能在外部函數(shù)中用dllimport導(dǎo)入相關(guān)代碼秸谢。

常用方法

  • 因?yàn)橥粋€(gè)頭文件里的變量需要兩種不同的聲明前綴,因此一般通過(guò)一個(gè)宏DLL_BUILD來(lái)區(qū)分
#ifdef DLL_BUILD
      #define DLL_EXPORT __declspec(dllexport)
#else
      #define DLL_EXPORT __declspec(dllimport)
#endif
  • 在生成dll工程中,工程屬性下記得要設(shè)置預(yù)處理器定義BUILD_DLL告訴編譯器該接口需要暴露
  • 在外部調(diào)用這個(gè)dll的工程中凛澎,包含這個(gè)頭文件,此時(shí)BUILD_DLL宏沒(méi)有定義估蹄,所以用了dllimport這個(gè)關(guān)鍵字预厌,是告訴編譯器該接口是從外部導(dǎo)入的

插曲: 對(duì)于動(dòng)態(tài)庫(kù)本身必須使用關(guān)鍵字__declspec(dllexport),對(duì)于應(yīng)用程序,不使用 __declspec(dllimport)也能正確編譯代碼,但使用 __declspec(dllimport) 使編譯器可以生成更好的代碼

回到開頭OSG庫(kù)的代碼中

  • OSG同時(shí)提供動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù), 且都使用一個(gè)頭文件,靜態(tài)庫(kù)頭文件中的聲明是不需要任何前綴關(guān)鍵字,因此為了解決關(guān)鍵字的沖突使用了OSG_LIBRARY_STATICOSG_LIBRARY來(lái)區(qū)分
    #  if defined( OSG_LIBRARY_STATIC )
    #    define OSG_EXPORT
    #  elif defined( OSG_LIBRARY )
    #    define OSG_EXPORT   __declspec(dllexport)
    #  else
    #    define OSG_EXPORT   __declspec(dllimport)
    #  endif
  • 編譯動(dòng)態(tài)庫(kù)時(shí),頭文件需要定義OSG_LIBRARY
  • 編譯靜態(tài)庫(kù)時(shí),頭文件需要定義OSG_LIBRARY_STATIC
  • 其他程序使用庫(kù)時(shí),頭文件不需要定義任何宏,只在遍歷名稱前加OSG_EXPORT即可
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末元媚,一起剝皮案震驚了整個(gè)濱河市轧叽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刊棕,老刑警劉巖炭晒,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異甥角,居然都是意外死亡网严,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門嗤无,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)震束,“玉大人,你說(shuō)我怎么就攤上這事当犯」复澹” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵嚎卫,是天一觀的道長(zhǎng)嘉栓。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么侵佃? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任麻昼,我火速辦了婚禮,結(jié)果婚禮上馋辈,老公的妹妹穿的比我還像新娘抚芦。我一直安慰自己,他們只是感情好迈螟,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布燕垃。 她就那樣靜靜地躺著,像睡著了一般井联。 火紅的嫁衣襯著肌膚如雪卜壕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天烙常,我揣著相機(jī)與錄音轴捎,去河邊找鬼。 笑死蚕脏,一個(gè)胖子當(dāng)著我的面吹牛侦副,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驼鞭,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼秦驯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了挣棕?” 一聲冷哼從身側(cè)響起译隘,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洛心,沒(méi)想到半個(gè)月后固耘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡词身,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年厅目,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片法严。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡损敷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出深啤,到底是詐尸還是另有隱情拗馒,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布墓塌,位于F島的核電站瘟忱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏苫幢。R本人自食惡果不足惜访诱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望韩肝。 院中可真熱鬧触菜,春花似錦、人聲如沸哀峻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剩蟀。三九已至催蝗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間育特,已是汗流浹背丙号。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缰冤,地道東北人犬缨。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像棉浸,于是被迫代替她去往敵國(guó)和親怀薛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容