• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            ACG狂人

            其實我更愛姐汁...

            原來靜態庫是這樣鏈接的

            最近在win32平臺下封裝MySQL的客戶端C API時,出現的問題著實讓我頭痛了個把小時,不過多虧這一來,我終于明白了靜態庫是怎樣鏈接的,結合了以前我對動態庫與靜態庫之間進行比較的一些測試結論,也明白了為什么靜態庫需要這樣的設計。不由感嘆一下古人的那句話:“挫折果真是成功的母親。”(好大霧^_^!)
            閑話不多說,記錄一些關鍵點,首先是靜態鏈接到底和動態鏈接有哪些不太容易發現的區別呢?我來假設libA依賴libB,那么我的執行文件在使用libA的時候也需要導入libB才能正確鏈接,但若dllA依賴libB的話,則只需導入dllA就可以。我在一開始用MySQL時使用的內嵌數據庫模式,所以導入的是那個libmysql.dll動態庫,因此沒出現問題。而換上了mysqlclient.lib后,居然告訴我沒有找到socket相關的實現,即“無法解析的外部符號”這類錯誤,于是乎我只有加上ws2_32.lib庫才能通過。
            為什么這樣設計?原因其實跟靜態庫的連接方式有關,由于靜態庫直接將函數實現和全局靜態變量導入到包含它的執行體中,所以在多層多重的庫包含中就會有大量重定義的問題存在,想想你在一個靜態庫中用了單件模式,那么其他庫又包含你這個庫,最后exe又包含所有這些庫,最終形成菱形依賴,如果靜態庫不這樣設計的話,問題就會像C++的多重繼承問題一樣。之所以靜態庫這樣設計,跟C++的虛擬繼承思想簡直如出一轍。(我知道這段話其實只有已經懂了的人才能看得懂,不過沒辦法,我表達能力挺笨的...)

            還有個極度郁悶的地方是:mysqlclient.lib中的libcmtd.lib和msvcrtd.lib這對活寶居然也被鏈接進去了,我這邊首先需要忽略這兩個默認庫,然后再包含msvcrtd.lib才可以。我不知道為啥sdk提供的靜態庫非得在c runtime link的方式上跟一般人過不去,又懶得去自己編譯,哎!將就一下就這么用吧......

            posted on 2009-10-06 21:30 釀妹汁 閱讀(1596) 評論(0)  編輯 收藏 引用 所屬分類: C++

            国内精品久久久久久麻豆| 国产69精品久久久久9999APGF| 亚洲国产精品无码久久久秋霞2 | 99久久99久久精品免费看蜜桃| MM131亚洲国产美女久久| 久久精品国产色蜜蜜麻豆| 亚洲国产一成久久精品国产成人综合 | 中文字幕精品久久久久人妻| 99久久99久久精品免费看蜜桃| 久久精品国产亚洲综合色 | 国产亚洲欧美成人久久片| 久久99精品久久久久久不卡| 亚洲午夜无码久久久久| 久久久久无码国产精品不卡| 久久久久久久人妻无码中文字幕爆| 91精品国产91久久久久久蜜臀| 久久精品免费一区二区| 色噜噜狠狠先锋影音久久| 无码日韩人妻精品久久蜜桃 | 国产午夜免费高清久久影院| 亚洲国产成人精品无码久久久久久综合| 久久综合狠狠综合久久| 久久人人爽人人爽人人片AV高清| 国产精品99久久久久久www| 狠色狠色狠狠色综合久久| 久久久久久久久无码精品亚洲日韩| 大香伊人久久精品一区二区 | 亚洲精品97久久中文字幕无码| av无码久久久久不卡免费网站| 77777亚洲午夜久久多人| 伊人伊成久久人综合网777| 亚洲美日韩Av中文字幕无码久久久妻妇 | 久久中文字幕视频、最近更新| 亚洲国产成人久久综合碰碰动漫3d| 亚洲va中文字幕无码久久不卡| 亚洲国产香蕉人人爽成AV片久久| 久久97久久97精品免视看秋霞| 中文字幕成人精品久久不卡| 亚洲一本综合久久| 久久久91人妻无码精品蜜桃HD| 久久精品成人免费观看97|