浅谈如何将linux上的程序移植到windows上

浅谈如何将linux上的程序移植到windows上

最近在做一个项目,我需要快速的求解大规模稀疏线性方程组,目前网上有一些开源的项目,其中一个较流行的是UMFPACK,从算法本身来说它具有很好的并行性,我需要使用它里面的一些东西,从网上下载的源代码只能在linux运行,但该项目需要在windows上运行,因此需要将UMFPACK移植到windows上,为了方便对程序进行跟踪调试,整个项目在vs2010中进行。

查阅了大量的资料发现目前将linux上的程序移植到windows上绝大部分都是使用的cygwin,我也通过使用cygwin在windows上成功的运行了demo程序,虽然可以使用cl命令来编译demo,但整个过程是在命令行中进行的,程序的跟踪调试也不是太方便。既然想要使用vs2010,因此就不能借助于cygwin。上面这条路行不通,就只能根据makefile文件中的依赖关系,手动在vs2010中修改项目编译链接的条件,从而达到要求。

为了能保证UMFPACK可在vs2010中调试、运行,我是从两个方面入手的:

        (1)判断UMFPACK能否脱离linux环境进行编译

         这一步的主要工作就是判断源程序是否调用了linux自带的函数,从而确定程序移植的可行性。由于源程序的数目过多,在linux下通过makefile文件来管理文件之间的依赖关 系,之后通过make命令来执行程序,从而保证程序的正确执行。其实在windows上也可以运行makefile文件,它的执行命令是nmake,但windows中makefile文件的格式与linux中makefile文件的格式有所不同,因此就需要将linux下的makefile文件转化为windows上的makefile文件,具体格式都可以从网上查到,这里就不在多说。转化之后 得到了运行demo程序,得到了正确的解,这就表明该项目的源文件可以不做修改就移植到windows上。

         (2)在vs2010中建立UMFPACK的工程

         通过第(1)步的验证,linux下的项目可以移植到windows上,那么直接把需要的.c、.h都存放在UMFPACK的目录下,然后在vs2010中将其分别导入到源文件和头文件中,不就可以了吗?这个方案是可行的,但有一个问题,所有.c文件的编译条件都将相同,但是通过观察makefile文件发现,.c文件的编译条件是存在差异的,那这应该怎么办呢, 这时就需要更改每个.c文件的编译条件,解决办法为:vs资源管理器--->选中某个.c文件--->进入其属性页面--->配置属性--->常规,在右边出现的项类型选项中选择“自定义生成工具”,保存之后运行。当有上百个.c文件时,这种方法就不可取了。

          查阅资料,发现了另外一种方法,思路很简单,就是将.c文件按照编译条件进行分类,相同编译条件的文件为一类,然后根据编译条件建立不同的工程。UMFPACK提供的程序是供我自己写的程序调用的,在一个解决方案中将我自己写的程序设定为可执行工程,将UMFPACK提供的源文件设定为静态库工程,然后在可执行工程中引用这些静态库工程就可达到预期的目标。

小结

通过上面的叙述,在linux上编写的程序能够移植到windows上执行,首先判断该程序能否移植到linux上,然后在windows上进行修改,保证其可以运行。在实际的运用中,可以将(2)中的两种方法进行融合,当有很多.c文件的编译条件相同时,就可建一个静态库工程,不多的时候就可与其他文件合建一个工程,这样就可减少所建工程的个数。


你可能感兴趣的:(linux编程)