日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

將Linux代碼移植到Windows的簡(jiǎn)單方法( 四 )


利用這些資料,并通過(guò)相關(guān)的工具比如sourceinsight來(lái)搜索Cygwin本身的源代碼,Link問(wèn)題并不難處理 。只是有可能在處理link問(wèn)題的過(guò)程中會(huì)回復(fù)到上面的問(wèn)題,編譯不過(guò) 。這個(gè)時(shí)候的代碼修改還是一定要注意不要引入太多的新的代碼,免得問(wèn)題越來(lái)越復(fù)雜 。
四:代碼運(yùn)行正常
實(shí)際上當(dāng)link問(wèn)題解決之后,程序可以在windows環(huán)境中運(yùn)行時(shí),一切就盡在掌握了 。如果不考慮做多平臺(tái)的程序的話,這個(gè)時(shí)候就可以任意去修改程序了 。不過(guò)在代碼調(diào)試過(guò)程可能需要一個(gè)參照,看看正常的程序運(yùn)行流程是怎么樣的 。剛剛移植過(guò)來(lái)的程序在很多地方并不能馬上就能正常的運(yùn)行 ?;氐紺ygwin中,重新編譯一個(gè)可以調(diào)試的版本(在GCC編譯選項(xiàng)加上-g3),在需要的時(shí)候可以在Cygwin中調(diào)試程序 。調(diào)試可以用GDB或者Insight 。如果習(xí)慣Windows 平臺(tái)下面編程,可以使用Insight,這是一個(gè)TCL/TK腳本程序,它提供了一個(gè)Windows界面以方便用戶調(diào)試程序,不過(guò)Insight最終還是調(diào)用GDB 。在這里具體調(diào)試就不細(xì)說(shuō)明了 。
五:多平臺(tái)代碼
移植后的代碼(本文于2003年完成. 如需要轉(zhuǎn)載 請(qǐng)聯(lián)系jackforce@163.com)如果需要在多個(gè)平臺(tái)上面運(yùn)行,就要在lib目錄里面大做文章了 。提供自己的函數(shù)庫(kù),并根據(jù)各個(gè)平臺(tái)進(jìn)行調(diào)整 。Tar的代碼由Config.h和一些編譯選項(xiàng)來(lái)控制如何在各個(gè)不同的平臺(tái)上面做編譯 。Lib則提供了很多C Library函數(shù)或者不同平臺(tái)下面的其他函數(shù)的替代版本 。這樣Tar在編譯過(guò)程中就不會(huì)因?yàn)槟承┢脚_(tái)下某些函數(shù)的缺失而編譯不過(guò) 。多平臺(tái)支持,一般都是在代碼中加上很多編譯開關(guān),在編譯期間去分隔Linux,Windows或者其他平臺(tái)下面的特殊代碼 。比如utime.h頭文件的包含問(wèn)題 。因?yàn)槲募贚inux(gcc)下面和Windows(cl)下所處的C Library目錄不同 。包含的處理辦法就不一樣 ??赡苄枰@樣寫才能完全正確的包含 。
#if HAVE_UTIME_H ?---- 如果有utime.h 文件
# ifdef WIN32 ?-----如果是win32環(huán)境
# include?-----包含sys/utime.h
# endif
# ifdef LINUX ?---- 如果是Linux環(huán)境
# include ?---- 包含utime.h
# endif
#else ?--- 如果沒(méi)有utime.h定義出需要的結(jié)構(gòu)
struct utimbuf
{
long actime;
long modtime;
};
#endif
在其他的代碼中基本上也是這樣的處理 。根據(jù)編譯環(huán)境的不同來(lái)編譯不同的代碼 。這樣的define的區(qū)隔,主要就是為了區(qū)隔不同平臺(tái)的不同細(xì)微區(qū)別 。有的區(qū)別也許是某些常量沒(méi)有定義,有些區(qū)別是某些函數(shù)不存在 。如果代碼中調(diào)用函數(shù)在某些平臺(tái)下面不存在,就需要提供一個(gè)lib去提供這些函數(shù) 。Tar的Lib的作用也是如此 。
基本上代碼的移植是前難后易 。前期首先要保證源代碼本身的邏輯不能變動(dòng),所以在修改代碼方面只能盡量修改外圍的代碼,而不是修改源代碼本身 。如果link過(guò)了之后,則就是一般的Windows下面的編程了,可以根據(jù)需求任意修改移植后的代碼了 。最難的地方可能就是OS級(jí)不同概念的替換了 。C Library雖然在各個(gè)平臺(tái)上有不同之處,但是總是比較接近,不同的地方可以提供自己編寫的代碼來(lái)替換 。但是OS級(jí)的概念,和平臺(tái)相關(guān)性太大,一般不太容易替換 。
六:擴(kuò)展問(wèn)題,待解決的問(wèn)題
如果需要把移植過(guò)來(lái)的代碼改成DLL或者lib給其他的工程調(diào)用 。比如給其他的工程提供一個(gè)解包Tar文件的功能 。如果不加修改,那么移植過(guò)來(lái)的代碼有很多缺陷 。
首先是多線程支持問(wèn)題 。如果代碼中有很多全局變量,那么改成DLL或者lib之后就不能在多線程下面調(diào)用 。
其次,DLL接口表 。移植后的代碼入口是main函數(shù),雖然整個(gè)工程里面有很多獨(dú)立功能,但是這些獨(dú)立功能的調(diào)用都是通過(guò)使用不同的參數(shù)來(lái)實(shí)現(xiàn) 。如何輸出接口表給其他工程使用,需要做些功夫 。

推薦閱讀