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

將Linux代碼移植到Windows的簡單方法( 二 )


/* Define if you have the header file. */
#define HAVE_LOCALE_H 1
/* Define if you have the header file. */
#define HAVE_MALLOC_H 1
/* Define if you have the header file. */
#define HAVE_MEMORY_H 1
/* Define if you have the header file. */
/* #undef HAVE_NDIR_H */
第二步,調(diào)整各種數(shù)據(jù)類型的定義,可能在linux下面會(huì)有很多特殊的數(shù)據(jù)類型定義,Config.h文件中也包含了一部分可以變動(dòng)的數(shù)據(jù)類型定義項(xiàng) 。這些定義一般都是基本數(shù)據(jù)類型的重定義 。可以根據(jù)Windows平臺(tái)下的數(shù)據(jù)類型定義情況進(jìn)行修補(bǔ) 。比如在Cygwin的開發(fā)環(huán)境中有個(gè)數(shù)據(jù)類型mode_t,Visual Studio的C Library中卻(作者 很土,聯(lián)系方法 jackforce at 163 dot com)找不到這樣數(shù)據(jù)類型 。Tar代碼中使用了大量的mode_t數(shù)據(jù)類型. config.h中提供了修改項(xiàng)來讓開發(fā)人員自己修改mode_t的定義,并提示如果mode_t在中沒有定義的話,可以把他定義為int型 。所以在config.h加上#define mode_t int 。這樣mode_t沒有定義的問題就解決了 。其他的數(shù)據(jù)類型也是同樣對(duì)待處理 。
* Define to `int" ifdoesn"t define. */
#define mode_t int
/* Define to `long" ifdoesn"t define. */
/* #undef off_t */
/* Define to `int" ifdoesn"t define. */
#define pid_t int
第三步,調(diào)整各種函數(shù)定義 。在Config.h中除了HAVE_XXXXX_H之外還有一種預(yù)定義,HAVE_XXXX 。這是一些可選用函數(shù)定義開關(guān) 。#define HAVE_MEMSET 1 表示工程中可以使用memset函數(shù) 。也就是說工程用到的類庫中已經(jīng)實(shí)現(xiàn)了這個(gè)函數(shù) 。如果沒有,那么就需要#undef HAVE_MEMSET,當(dāng)然也可以自己提供這些函數(shù) 。
/* Define if you have the memset function. */
#define HAVE_MEMSET 1
/* Define if you have the mkdir function. */
#define HAVE_MKDIR 1
/* Define if you have the mkfifo function. */
#define HAVE_MKFIFO 1
/* Define if you have the munmap function. */
#define HAVE_MUNMAP 1
最后,Config.h文件中除了上面的頭文件,函數(shù),數(shù)據(jù)類型編譯選項(xiàng)之外,還有其他一些東西,比如環(huán)境變量,其他編譯選項(xiàng) 。這些內(nèi)容會(huì)根據(jù)不同的項(xiàng)目而有很大的不同 。但是可以從Config.h基本看出移植的工作量有多大 。
經(jīng)過上面的調(diào)整之后,勢(shì)必(作者很土,其他文章 請(qǐng)查看vchelp很土專欄)因?yàn)閃indows環(huán)境下沒有某些頭文件,比如poll.h,就會(huì)沒有poll函數(shù),沒有dirent.h 就會(huì)沒有dirent 結(jié)構(gòu)體 。而繼續(xù)使得WinTar編譯不過 。這個(gè)時(shí)候就需要根據(jù)具體的編譯錯(cuò)誤信息進(jìn)行細(xì)節(jié)修飾 。當(dāng)需要使用Windows下一些特殊的定義的時(shí)候請(qǐng)不要忘了在Config.h的最前面加入#include .
關(guān)于細(xì)節(jié)修飾,舉個(gè)例子來說明 。比如有個(gè)選項(xiàng)HAVE_INTTYPES_H
/* Define if exists, doesn"t clash with ,
and declares uintmax_t. */
#define HAVE_INTTYPES_H 1
通過分析代碼可以發(fā)現(xiàn),代碼并不是需要一個(gè)完整的inttypes.h文件,而是為了一個(gè)uintmax_t的定義 。在Visual Stdio的C Library中并沒有inttypes.h這個(gè)文件,也沒有uintmax_t這個(gè)定義 ?;厮軨ygwin的include目錄的inttypes.h文件,發(fā)現(xiàn)了uintmax_t的定義
typedef unsigned long long uintmax_t;
很簡單的數(shù)據(jù)類型重定義 。這么簡單定義,完全可以從Cygwin的Include目錄中單獨(dú)拿出來做一個(gè)專用版本的inttypes.h加入到WinTar項(xiàng)目中 。這樣編譯過程中uintmax_t沒有定義的問題就解決了 。解決這類問題的一般的做法也就是從Cygwin的Include目錄里面拿出相關(guān)的頭文件進(jìn)行修改或者單獨(dú)復(fù)制到WinTar的目錄下面 。[本文于2003年完成. 如需要轉(zhuǎn)載 請(qǐng)聯(lián)系jackforce at 163 dot com ]修改或者復(fù)制代碼的原則是不再引入更多的定義或者頭文件,僅取所需部分 。其他類似的問題還有direct結(jié)構(gòu)定義和相關(guān)函數(shù) 。
在編譯過程中,很多錯(cuò)誤是有由lib目錄下的文件產(chǎn)生的,但是lib目錄下的文件不是完全都需要的 。lib目錄只是一個(gè)對(duì)Tar的補(bǔ)充庫 。需要的代碼才需要編譯 。具體判斷的方法一個(gè)是參考Windows C Library庫的內(nèi)容 。如果同樣的函數(shù),數(shù)據(jù)類型已經(jīng)定義,就不需要Lib目錄中的相同數(shù)據(jù)類型的定義和函數(shù)實(shí)現(xiàn)了 。還有一個(gè)方法是盡量去掉lib目錄中的C文件,只保留頭文件,并使得編譯能夠通過,根據(jù)link的錯(cuò)誤信息去檢查那些lib中的C文件是需要的 。

推薦閱讀