青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-3  評論-5  文章-13  trackbacks-0

--------------------------------------------------------------------------------
標題: C++ 代碼移植要點
作者: 葉飛虎
日期: 2010.09.06
--------------------------------------------------------------------------------

1. 分層設計
   隔離平臺相關的代碼, 就像可測試性一樣, 可移植性也要從設計抓起。一般來說, 最上
   層和最下層都不具有良好的可移植性:
      1). 最上層是 GUI, 大多數 GUI 都不是跨平臺的, 如: Win32 SDK 和 MFC
      2). 最下層是操作系統 API, 大部分操作系統 API 都是專用的

   如果這兩層的代碼散布在整個軟件中, 那么這個軟件的可植性將非常的差, 這是不言自
   明的。那么如何避免這種情況呢? 當然是分層設計了:
      1). 最底層采用 Adapter 模式, 把不同操作系統的 API 封裝成一套統一的接口(如:
          KYLib 庫), 至于封裝成類還是封裝成函數, 要看實際情況而定。如果在開發第
          一個平臺時就采用 KYLib, 可以大大減少移植的工作量。

      2). 最上層采用分離界面表現與內部邏輯代碼的模式, 把大部分代碼放到內部邏輯里
          面, 界面僅僅是顯示和接收輸入, 即使要換一套 GUI, 工作量也不大。這同時也
          是提高可測試性的手段之一, 當然還有其它一些附加好處。所以即使你采用 QT
          或者 GTK+ 等跨平臺的 GUI 設計軟件界面, 分離界面表現與內部邏輯也是非常
          有用的。


2. 注意平臺的特性
   a. 目錄分隔符: 在Windows下用 '\\', 在Linux下用 '/'。

   b. 文本文件換行符: 在Windows下用 "\r\n", 在Linux下用 '\n'。

   c. 在 Windows 中文件名不區分大小寫字母, 而在 Linux 中則區分大小寫字母。

   d. 在 Windows 中線程可以 suspend 和 resume, 而在 Linux 中則不允許此操作。

   e. 在 Windows 的動態庫中, 除非明確指明為 export 的函數外, 其它函數對外都是不
      可見的。

   f. 在 Linux 的共享庫中, 所有非 static 的全局變量和函數, 對外全部是可見的。這
      要特別小心, 同名函數引起的問題, 讓你查上兩天也不為過。

   g. 在 Linux 的共享庫中, 如果想綁定共享庫里的全局符號(變量, 函數和類等等), 則
      在鏈接共享庫的時候, 添加 gcc 選項 -Wl,-Bsymbolic 即可。

   h. 在 Linux 的共享庫中, 如果共享庫存取主程序里定義的全局符號, 鏈接主程序的時
      候, 使用參數 -Wl,--export-dynamic 即可。


3. 最好不要使用編譯器特有的特性
   a. 像在 VC 里, 你要實現線程局部存儲, 在變量前加一個 __declspec( thread ) 就行
      了, 然而盡管在 pthread 里有類似的功能, 卻不能按這種方式實現, 所以無法移植
      到 Linux 下。

   b. 同樣 gcc 也有很多擴展, 是在 VC 或者其它編譯器里所沒有的。如編譯成多線程安
      全的選項 -pthread, 此選項在編譯源程序和鏈接時使用。


4. 數據類型差別
   a. 在 VC 中64位整型是 __int64, 而在 Linux 中是 int64_t。

   b. 在 VC 中函數指針默認情況下可以直接賦值給 void* 類型變量, 而在 Linux 中則不
      允許直接賦值, 必須使用 (void*) 強制轉換。

   c. 在 Windows 中的原子鎖相關函數 InterlockXXX 中的參數類型是 long*,
      而在 Linux 中參數類型是 int*。


5. 調用外部庫(靜態庫和動態庫)差異
   a. 在 VC 中調用外部庫有 .lib 支持, 若是動態庫則直接通過 .lib 關聯。

   b. 在 Linux 中調用靜態庫為 .a 文件, 庫之間的先后順序非常重要, 如 libKYLib.a
      和 libkylin.a, 且 kylin 依賴 KYLib, 則在工程中加載庫的順序必須為: 先加載
      libkylin.a, 再加載 libKYLib.a。

   c. 在 Linux 中調用動態庫為 .so 文件, 如果有好幾個庫, 它們之間有一些依賴關系的
      話, 例如 X 依賴 Y, 那么你就要先加載那些被依賴的 Y, 然后加載 X。

   d. 在 Linux 中混合調用靜態庫和動態庫, 如使用 libKYLib.a 和 libswgci32c.so, 且
      libswgci32c.so 中使用了 libKYLib.a, 則在加載庫時必須先加載 libKYLib.a, 然
      后再加載 libswgci32c.so。


6. 加載動態庫時查找路徑順序的差異
   a. Windows 庫搜索路徑和順序
      1). 應用程序目錄
      2). 當前工作目錄
      3). 系統目錄 (%systemroot%, %systemroot%\system 和 %systemroot%\system32),
          如: C:\WINNT\, C:\WINNT\system, C:\WINNT\system32
      4). 路徑變量 (系統的環境變量 Path)

   b. Linux 庫搜索路徑和順序
      1). 鏈接時指定的路徑, 如: -Wl,-rpath=./ 選項表示編譯時 ld 路徑
      2). 環境變量 LD_LIBRARY_PATH 指明的路徑
      3). /etc/ld.so.cache中的函數庫列表
      4). /lib目錄, 然后/usr/lib
      5). 當前工作目錄


7. 動態庫入口函數的差異
   a. Windows 中有 DllMain 入口函數, 而 Linux 中則沒有。

   b. Linux 中有特殊函數 _init 和 _fini, 主要是分別用來初始化函數庫和關閉的時候
      做一些必要的處理, 我們可以把自己認為需要的代碼放到這兩個函數里面, 它們分別
      在函數庫被加載和釋放的時候被執行。具體說, 如果一個函數庫里面有一個名字為
      "_init" 的函數輸出, 那么在第一次通過 dlopen() 函數打開這個函數庫, 或者只是
      簡單的作為共享函數庫被打開的時候, _init 函數被自動調用執行。與之相對應的就
      是 _fini 函數, 當一個程序調用 dlclose() 去釋放對這個函數庫的引用的時候, 如
      果該函數庫的被引用計數器為 0 了, 或者這個函數庫是作為一般的共享函數庫被使
      用而使用它的程序正常退出的時候, _fini就會被調用執行。

      C語言定義它們的原型如下:
      void _init(void);
      void _fini(void);

      當使用你自己的 _init 和 _fini 函數時, 會出現命名沖突, 就會得到一個
      "multiple-definition" 的錯誤, 編譯器提示已經存在這個名字, 可以通過幾種方式
      來解決:
         1). 自定義 init 函數名字, 比如 myinit 用 -Wl, 選項給 ld 傳遞此名字:
         gcc ... -Wl,-init=myinit

         2). 當 GCC 編譯源程序時, 可以使用選項 -nostartfiles 來使共享庫不與系統
             啟動文件一起編譯
         gcc ... -nostartfiles

         3). 使用上面的函數或 GCC 的 -nostartfiles 選項并不是很好的習慣, 因為這
             可能會產生一些意外的結果。相反, 庫應該使用
             __attribute__((constructor)) 和 __attribute__((destructor)) 函數屬
             性來輸出它的構造函數和析構函數。如下所示:

             void __attribute__((constructor)) x_init(void);
             void __attribute__((destructor))  x_fini(void);

             構造函數會在dlopen()返回前或庫被裝載時調用;
             析構函數會在這樣幾種情況下被調用: dlclose() 返回前, 或 main() 返回
             后, 或裝載庫過程中 exit() 被調用時。

   c. Linux 中的初始化和釋放函數不建議使用。

--------------------------------------------------------------------------------

posted on 2011-05-22 10:55 Kyee Ye 閱讀(505) 評論(0)  編輯 收藏 引用 所屬分類: C++類庫KYLib
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美成人一二三| 亚洲精品一区二| 国产精品视频免费一区| 一区二区三区亚洲| 性色av一区二区三区| 亚洲二区视频| 欧美一区二区三区视频在线观看| 欧美啪啪成人vr| 在线不卡中文字幕播放| 久久精品免费看| 亚洲综合精品四区| 欧美日韩一级黄| 亚洲乱码久久| 亚洲韩国青草视频| 欧美大片在线观看一区| 亚洲欧洲精品一区二区三区不卡| 老巨人导航500精品| 久久九九精品| 在线成人亚洲| 亚洲电影第1页| 女仆av观看一区| 亚洲精品日韩在线| 亚洲精品欧美| 欧美精品久久久久久久免费观看| 亚洲精品免费在线播放| 亚洲欧洲精品一区二区精品久久久| 欧美1区2区3区| 99精品久久久| 日韩系列欧美系列| 欧美日韩一区二区视频在线观看| 一区二区成人精品| 亚洲天堂av在线免费| 国产精品午夜在线| 久久久久久亚洲精品不卡4k岛国| 久久久久久久综合色一本| 红桃视频国产精品| 亚洲福利视频在线| 欧美午夜电影完整版| 欧美一区二区在线视频| 久久国产色av| 亚洲人成亚洲人成在线观看| 亚洲最新合集| 国内精品视频一区| 亚洲日产国产精品| 国产欧美日韩另类一区| 女仆av观看一区| 欧美日韩高清在线观看| 欧美一区二区三区精品| 蜜臀va亚洲va欧美va天堂| 亚洲视频精选| 久久久福利视频| 亚洲男女自偷自拍| 久久躁狠狠躁夜夜爽| 国产精品99久久不卡二区| 香蕉久久夜色精品| 日韩视频在线你懂得| 先锋影音久久久| 亚洲免费观看| 欧美一区二区黄| 正在播放欧美一区| 欧美在线亚洲| 亚洲一区二区三区影院| 久久久噜噜噜久噜久久| 亚洲欧美综合另类中字| 你懂的一区二区| 久久久久久综合网天天| 欧美日韩中文精品| 欧美激情一区在线观看| 国产午夜精品视频免费不卡69堂| 亚洲高清免费| 一区二区在线不卡| 亚洲女ⅴideoshd黑人| 夜色激情一区二区| 美女91精品| 久久夜色精品国产亚洲aⅴ| 国产精品成人一区二区三区吃奶| 欧美gay视频激情| 国产一区二区三区在线观看精品 | 在线视频欧美一区| 在线看国产一区| 午夜精品三级视频福利| 亚洲一二三区在线观看| 免费视频一区| 男女激情久久| 伊人久久亚洲影院| 久久精品日产第一区二区| 午夜天堂精品久久久久 | 亚洲主播在线播放| 欧美日韩高清一区| 亚洲精品美女在线观看| 亚洲精品影院在线观看| 欧美成人69av| 欧美高清视频| 亚洲激情视频在线| 另类天堂av| 亚洲第一福利社区| 最新日韩在线| 欧美激情女人20p| 欧美国产精品一区| 亚洲欧洲日本专区| 欧美精品三级日韩久久| 亚洲精品在线二区| 亚洲夜晚福利在线观看| 欧美亚一区二区| 这里只有精品视频| 亚洲欧美日韩另类精品一区二区三区| 欧美日一区二区在线观看| 一区二区免费在线视频| 性欧美1819sex性高清| 国产精品区一区二区三| 亚洲欧美日韩爽爽影院| 久久久久免费观看| 亚洲成色www久久网站| 巨胸喷奶水www久久久免费动漫| 暖暖成人免费视频| 99国产精品一区| 欧美亚州一区二区三区| 校园激情久久| 欧美成人亚洲成人| 99热在线精品观看| 国产精品国产三级国产普通话三级 | 99国产精品久久久久久久| 欧美日韩专区| 久久成人免费电影| 亚洲国产cao| 亚洲欧美精品一区| 国产一区二区欧美日韩| 麻豆精品视频在线观看| 亚洲美女毛片| 久久久天天操| 日韩视频精品在线| 国产精品一国产精品k频道56| 欧美影院在线| 亚洲免费观看高清完整版在线观看熊| 午夜精品久久久久| 亚洲动漫精品| 国产精品久久久久影院亚瑟 | 国产日韩欧美在线播放不卡| 久久亚洲精品一区| 一区二区三区四区国产| 久久亚洲二区| 亚洲一区二区三区午夜| 亚洲第一福利视频| 国产精品嫩草99av在线| 久久久久久久国产| 国产精品99久久不卡二区| 欧美刺激性大交免费视频| 亚洲欧美日韩一区| 亚洲精品自在久久| 黄色成人av在线| 国产精品久久久久久av下载红粉| 久久综合久久综合久久综合| 亚洲女爱视频在线| 日韩一级网站| 亚洲电影专区| 牛牛影视久久网| 久久久天天操| 欧美永久精品| 亚洲欧美电影院| 99热免费精品在线观看| 亚洲高清一区二| 国产一区二区三区的电影| 国产精品theporn| 欧美激情片在线观看| 美女爽到呻吟久久久久| 久久av一区二区三区漫画| 亚洲五月婷婷| 99av国产精品欲麻豆| 亚洲福利在线视频| 免费成年人欧美视频| 久久久久久久久久码影片| 欧美在线一区二区三区| 亚洲天堂av高清| aa国产精品| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲国产精品成人综合色在线婷婷 | 狠狠综合久久| 国产香蕉97碰碰久久人人| 国产精品久99| 国产精品啊啊啊| 国产精品啊v在线| 欧美亚洲第一页| 国产精品视频久久一区| 欧美香蕉大胸在线视频观看| 欧美日韩在线另类| 欧美午夜在线| 国产精品婷婷| 国产视频久久久久| 国内精品久久久| 在线激情影院一区| 亚洲人成网站精品片在线观看| 亚洲青色在线| 一本色道久久88综合亚洲精品ⅰ| 99精品热视频只有精品10| 国产精品99久久99久久久二8| 亚洲免费在线观看| 久久精品一区二区| 免费永久网站黄欧美| 亚洲激情电影中文字幕| 一区二区三区免费看|