怎样在Windows和Linux下写相同的代码

目前,Linux在国内受到了越来越多的业内人士和用户的青睐。相信在不久的将来,在国内为Linux开发 的应用软件将会有很大的增加(这不,金山正在招兵买马移植WPS呢)。由于未来将会是Windows和Linux两强鼎立的格局,怎样能够使得开发的软件保持最大的可移植性就成了一个很重要的问题。小弟经过一段时间的摸索,找到了这个问题的圆满解答。 
在Linux下,所有的开发工具和库都属于自由软件,可以免费获得并且功能强大。如果这些工具和库都有相应的Windows版,那么我们就能够在Windows和Linux下保持完全一致的开发环境。幸运的是这些工具和库都已经有了Windows版本。它们是: 
1、Windows版的gcc:MinGW(Minimalist GNU For Windows) 
MinGW是gcc的Win32版本,包括gcc、g++、g77、gdb、make及各种为MinGW移植的GNU软件。最新版的 MinGW将WIN32 API包括进来,具备了开发Windows软件的所有功能。它可以编译Win32应用程序,生成dll,还可以从dll产生import lib,从而使用已有的其它编译器生成的dll。与另一套Win32版的GNU开发工具Cygwin 不同的是,MinGW编译的程序并不需要另外的dll的支持,而是直接使用Windows提供的crtdll.dll(所有的 Windows版本)或者msvcrt.dll(较新的Win95/98,NT4)。因此执行效率得到了很大的提高,并且保证了线程安全,而Cygwin不是线程安全的。 
MinGW的主页在:http://www.mingw.org 
MinGW用的OpenGL库:http://www.cim.pe.u-tokyo.ac.jp/%7Ekawachi/software/cygwin_glut-e.html 
为MinGW移植的GNU软件:(包括bison、flex、sh、gawk、sed、grep、m4、less、bzip2、ls等等) 
ftp://ftp.franken.de/pub/win32/develop/gnuwin32/mingw32/porters/Mikey/ 
2、Windows版的GTK: 
目前,在Linux下最流行的Widget库GTK(包括GDB/GDK/GTK+)已经被移植到Windows下,使得用GTK编写的程序几乎不用做任何修改就可以移植到Windows下。这样,就可以在Windows和Linux下使用同样的代码写出源码相同,界面也完全相同的GUI程序。 
GTK for WIN32的主页在:http://user.sgic.fi/~tml/gimp/win32/ 
3、跨平台的多媒体开发库:SDL(Simple DirectMedia Layer) 
SDL是一套用来进行游戏开发的多媒体开发库,与其它多媒体开发库相比最大的优点是它是自由软件,并且可同时用于Linux(还有其它的UNIX)和Windows。通过调用SDL的API使得我们可以在Windows和Linux下开发出代码完全相同的多媒体应用程序。目前已经有很多人在用SDL写程序和移植游戏了,其中比较有名是 Linux下的VCD播放软件MTV。 
SDL的主页在:http://www.devolution.com/~slouken/SDL 
4、Linux版的OpenGL库: 
Linux下的OpenGL库中最好的当然是Mesa了,您还不知道Mesa吗? 
Mesa的主页在:http://www.mesa3d.org/ 
实战演练: 
1、首先,下载以下软件: 
ftp://ftp.nanotech.wisc.edu/pub/khan/gnu-win32/mingw32/gcc-2.95.2/gcc-2.95.2-msvcrt.exe 
http://www.cim.pe.u-tokyo.ac.jp/%7Ekawachi/software/glut-cygwin.zip 
http://user.sgic.fi/~tml/gimp/win32/glib-dev-20000215.zip 
http://user.sgic.fi/~tml/gimp/win32/gtk+-dev-20000215.zip 
http://user.sgic.fi/~tml/gimp/win32/extralibs-dev-20000201.zip 
http://www.devolution.com/~slouken/SDL/release/SDL-devel-1.1.1-mingw32.tar.gz 
http://www.devolution.com/~slouken/SDL/release/SDL-1.1.1-1.i386.rpm 
http://www.devolution.com/~slouken/SDL/release/SDL-devel-1.1.1-1.i386.rpm 
ftp://www.mesa3d.org/mesa/MesaLib-3.1.tar.gz 
ftp://www.mesa3d.org/mesa/MesaDemos-3.1.tar.gz 
http://www.devolution.com/~slouken/SDL/projects/gtk-demo/src/gtk-demo-1.0.tar.gz 
http://www.devolution.com/~slouken/SDL/opengl/OpenGL-intro-1.0.0.zip 
2、安装软件: 
安装gcc-2.95.2,假定安装在 C:/gcc-2.95.2。 
解压缩glut-cygwin.zip,假定在 C:/glut-cygwin下,将该目录下的include和lib目录全部拷到 
C:/gcc-2.95.2/i386-mingw32msvc下,将lib中所有的.dll拷到C:/Windows/System下。然后删除原目录。 
解压缩glib-dev-20000215.zip、gtk+-dev-20000215.zip、extralibs-dev-20000201.zip,假定都在C:/src下,将其改名为C:/gtk。将其目录下的所有.dll拷到C:/Windows/System下。 
解压缩SDL-devel-1.1.1-ming32.tar.gz,假定在C:/SDL-1.1.1下,将其中的test目录移到c:/work下,并改名为sdl。另有一个文件i386-mingw32.tar.gz,将其解压缩,假定在C:/i386-mingw32下,将该目录下的include和lib目录全部拷到C:/gcc-2.95.2/i386-mingw32msvc下,将lib中的SDL.dll拷到C:/Windows/System下,然后删除原目录。 
解压缩OpenGL-intro-1.0.0.zip,假定在C:/OpenGL-intro-1.0.0下,将其移到C:/work下并改名为 opengl。 
解压缩gtk-demo-1.0.tar.gz,假定在C:/gtk-demo-1.0下,将其移到C:/work下并改名为gtk。

3、编辑cc.bat,内容为: 
gcc -g -Dmain=SDL_main -I/gtk/glib -I/gtk/gtk+ -I/gtk/gtk+/gdk
-I/gcc-2.95.2/i386-mingw32msvc/include/SDL -L/gtk/glib -L/gtk/gtk+/gdk -L/gtk/gtk+/gtk %1 %2 %3
-lmingw32 -lSDLmain -lSDL -luser32 -lgdi32 -lwinmm -lglib-1.3 -lgdk-1.3 -lgtk-1.3 -lglut32
-lglu32 -lopengl32 
将其放在任何一个现有路径下(如:C:/DOS)

4、将路径C:/gcc-2.95.2/bin加入C:/Autoexec.bat的PATH中,重启机器。 
5、OK,现在看看你的成果吧,进入MS-DOS方式。 
cd c:/work/gtk 
编辑gtk-demo.c,将 #include 《gdk/gdkx.h》改为 #include 《gdk/win32/gdkwin32.h》 /* 因为这是在Win32环境下 */ 
cc -o gtk-demo gtk-demo.c 
gtk-demo 
怎么样,看到什么了?界面很土吧?可是你现在已经能够同时使用GTK和SDL在Windows下编程了。快把《GTK入门导引》里的helloworld.c 敲进去试试吧。 
cd c:/work/opengl 
cc -o lesson05 lesson05.c 
lesson05 
看到什么了?是不是两个旋转的物体,好了,现在opengl也OK了。 
cd c:/work/sdl 
cc -o loopwave loopwave.c 
打开音箱, 
loopwave sample.wav 
听到什么了,是不是一段优美的爵士乐?好了,现在声音也有了。 
Well done!! 现在世界已经是你的了,Go hell Micro-soft! 从SDL的主页下载一个quake,编译一把吧! 
怎么样?How about your feeling? 没有用一行Windows API,现在你已经可以在Windows下写游戏了。没有使用M$的任何开发工具,全部用自由软件,你写的程序已经能同时在Windows和Linux跑了。 
Go hell Micro-soft!!。 
最后,关于版权:不用担心什么版权问题,这些工具的版权许可如下 
MinGW:任意使用。GTK、SDL、Mesa:LGPL。 
因此你可以使用上述工具写任何自由的或商业的软件。

1.1    编译器运行操作系统

l        WINDOWS :  _WIN32、WIN32;

l        UNIX/LINUX:  unix、__unix、__unix__;

l        SunOS/SOLARIS: __SVR4、__svr4__、sun、__sun、__sun__、sparc、__sparc、__sparc__;

l        HPUX: __hppa、__hppa__、__hpux、__hpux__、_HPUX_SOURCE;

l        AIX: _AIX、_AIX32、_AIX41、_AIX43、_AIX51、_AIX52;

l        LINUX: linux、__linux、__linux__、__gnu_linux__;

l        CPU: __x86_64、__x86_64__(Intel); __amd64、__amd64__(AMD); sparc、  __sparc、__sparc__;

 1.2    编译器信息

l        __STDC__: ANSI C标志,值为1,说明兼容ANSI C标准;

l        __GNUC__: GCC编译器编预定义宏;__GNUC__的值表示GCC版本号;

l        __GNUC_MINOR__: GCC次版本号;

l        __GNUC_PATCHLEVEL__: GCC编译器修订版本号,l

l        __GLIBC_MINOR__: glib的次版本号;

l        VC++的版本宏:

l           Visual Studio 5.0  --> VC++5.0 _MSC_VER = 1100

l           Visual Studio 6.0  --> VC++6.0 _MSC_VER = 1200

l           Visual Studio 2002 --> VC++7.0 _MSC_VER = 1300

l           Visual Studio 2003 --> VC++7.1 _MSC_VER = 1310

l           Visual Studio 2005 --> VC++8.0 _MSC_VER = 1400

l           Visual Studio 2008 --> VC++9.0 _MSC_VER = 1500

怎样在Windows和Linux下写相同的代码

时间: 2024-10-05 07:12:22

怎样在Windows和Linux下写相同的代码的相关文章

【大话QT之五】Windows与Linux下文件操作监控的实现

一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场上网盘实现有一些的不同,主要在客户端与服务器端的操作需要双向进行,即:用户在客户端的操作需要及时同步到服务器端:在服务器端作业渲染生成的文件要及时同步到客户端.即:用户不在需要单独的下载数据,而是在作业运行的同时,渲染就过就会自动同步到客户端,大大缩短了等待时间.当然,无论是在客户端还是在服务端都面

socket在windows下和linux下的区别

windows到Linux代码移植遇到的问题 1.一些常用函数的移植 http://www.vckbase.com/document/viewdoc/?id=1586 2.网络 ------ 转载 & 修改(待整理) socket相关程序从windows移植到linux下需要注意的 1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h 错误处理:errno.h 2)初始化 windows下需要用WSAStartup linux下不需要 3)关

windows及linux下安装django simple captcha 遇到的各种问题及解决办法

转载自http://www.cnblogs.com/descusr/p/3225874.html 所有程序写完之后,验证码图片不显示,点击图片地址会提示如下错误,并且在linux下的纠正办法 用pil产生验证码出现:ImportError: The _imagingft C module is not installed 这个是由于PIL没有编译freetype导致的 查看 lib/python2.7/site-packages/PIL/ 看看 _imagingft.so 是否存在(至关重要,因

linux 下写python脚本实现自动补全( 我51论坛也有)

以前都是在windows下开发,但是对于玩linux的人来说,能够在linux下实现python脚本的自动补全的话,那是相当不错的,而我一般是使用的vim作为编辑器,且linux一般选择最小化安装,没有图形界面,参考了下网上的很多方法也没有适合自己,最后自己去看代码的帮助来实现了这个功能,废话不说,现在开始代码下载地址:http://vim.sourceforge.net/scripts/download_script.php?src_id=21842 文件名:pydiction-1.2.3.z

Windows与Linux下文件操作监控的实现

一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场上网盘实现有一些的不同,主要在客户端与服务器端的操作需要双向进行,即:用户在客户端的操作需要及时同步到服务器端:在服务器端作业渲染生成的文件要及时同步到客户端.即:用户不在需要单独的下载数据,而是在作业运行的同时,渲染就过就会自动同步到客户端,大大缩短了等待时间.当然,无论是在客户端还是在服务端都面

MySQL在Windows和Linux下还原数据库

Linux下还原数据库代码: 1,创建一个空的数据库cddl mysql> create database cddl; Query OK, 1 row affected (0.00 sec) 2,还原数据库 [[email protected] mysqlsoftware]# cd /etc/rc.d/init.d [[email protected] mysqlsoftware]# cd /etc/rc.d/init.d [[email protected] init.d]# mysql -h

Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码

主要难点在于设置recv()与send()的超时时间,具体要注意的事项,请看代码注释部分,下面是代码: [cpp] view plaincopyprint? #include <stdio.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <string.h> #ifdef _WIN32   ///

如何在windows下和linux下获取文件(如exe文件)的详细信息和属性

程序员都很懒,你懂的! 最近在项目开发中,由cs开发的exe的程序,需要自动升级,该exe程序放在linux下,自动升级时检测不到该exe程序的版本号信息,但是我们客户端的exe程序需要获取服务器上新程序的版本号信息.最后由我用java实现linux上exe文件的版本号读取功能.下面是详细代码: package com.herman.utils; import java.io.File; import java.io.FileNotFoundException; import java.io.I

打通windows和Linux下的传输问题解决只能使用SSH协议下的22端口来传输文件(Openssh for windows)

目的:打通windows和Linux下的传输问题解决只能使用SSH协议下的22端口来传输文件 环境: windows IP192.168.1.120 Linux IP192.168.101 方法: 安装opensshfor windows (次软件开源并增加ssh协议将windows模拟成Unix环境) 安装完软件导入本地用户或者域用户 进入到bin目录下面执行 cd "c:\Program Files(x86)\OpenSSH\bin" mkgroup -l >>..\e