将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 */
第二步,调整各种数据类型的定义,可能在linux下面会有很多特殊的数据类型定义,Config.h文件中也包含了一部分可以变动的数据类型定义项 。这些定义一般都是基本数据类型的重定义 。可以根据Windows平台下的数据类型定义情况进行修补 。比如在Cygwin的开发环境中有个数据类型mode_t,Visual Studio的C Library中却(作者 很土,联系方法 jackforce at 163 dot com)找不到这样数据类型 。Tar代码中使用了大量的mode_t数据类型. config.h中提供了修改项来让开发人员自己修改mode_t的定义,并提示如果mode_t在中没有定义的话,可以把他定义为int型 。所以在config.h加上#define mode_t int 。这样mode_t没有定义的问题就解决了 。其他的数据类型也是同样对待处理 。
* 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
第三步,调整各种函数定义 。在Config.h中除了HAVE_XXXXX_H之外还有一种预定义,HAVE_XXXX 。这是一些可选用函数定义开关 。#define HAVE_MEMSET 1 表示工程中可以使用memset函数 。也就是说工程用到的类库中已经实现了这个函数 。如果没有,那么就需要#undef HAVE_MEMSET,当然也可以自己提供这些函数 。
/* 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文件中除了上面的头文件,函数,数据类型编译选项之外,还有其他一些东西,比如环境变量,其他编译选项 。这些内容会根据不同的项目而有很大的不同 。但是可以从Config.h基本看出移植的工作量有多大 。
经过上面的调整之后,势必(作者很土,其他文章 请查看vchelp很土专栏)因为Windows环境下没有某些头文件,比如poll.h,就会没有poll函数,没有dirent.h 就会没有dirent 结构体 。而继续使得WinTar编译不过 。这个时候就需要根据具体的编译错误信息进行细节修饰 。当需要使用Windows下一些特殊的定义的时候请不要忘了在Config.h的最前面加入#include .
关于细节修饰,举个例子来说明 。比如有个选项HAVE_INTTYPES_H
/* Define if exists, doesn"t clash with ,
and declares uintmax_t. */
#define HAVE_INTTYPES_H 1
通过分析代码可以发现,代码并不是需要一个完整的inttypes.h文件,而是为了一个uintmax_t的定义 。在Visual Stdio的C Library中并没有inttypes.h这个文件,也没有uintmax_t这个定义 。回溯Cygwin的include目录的inttypes.h文件,发现了uintmax_t的定义
typedef unsigned long long uintmax_t;
很简单的数据类型重定义 。这么简单定义,完全可以从Cygwin的Include目录中单独拿出来做一个专用版本的inttypes.h加入到WinTar项目中 。这样编译过程中uintmax_t没有定义的问题就解决了 。解决这类问题的一般的做法也就是从Cygwin的Include目录里面拿出相关的头文件进行修改或者单独复制到WinTar的目录下面 。[本文于2003年完成. 如需要转载 请联系jackforce at 163 dot com ]修改或者复制代码的原则是不再引入更多的定义或者头文件,仅取所需部分 。其他类似的问题还有direct结构定义和相关函数 。
在编译过程中,很多错误是有由lib目录下的文件产生的,但是lib目录下的文件不是完全都需要的 。lib目录只是一个对Tar的补充库 。需要的代码才需要编译 。具体判断的方法一个是参考Windows C Library库的内容 。如果同样的函数,数据类型已经定义,就不需要Lib目录中的相同数据类型的定义和函数实现了 。还有一个方法是尽量去掉lib目录中的C文件,只保留头文件,并使得编译能够通过,根据link的错误信息去检查那些lib中的C文件是需要的 。

推荐阅读