怎样在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。
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)
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下写相同的代码的更多相关文章
- Windows与Linux下文件操作监控的实现
一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场 ...
- socket在windows下和linux下的区别
原文:socket在windows下和linux下的区别 1)头文件 windows下winsock.h/winsock2.h linux下sys/socket.h 错误处理:errno.h 2 ...
- php windows与linux下的路径区别
php windows与linux下的路径区别windows用的是"\",linux用的是"/"这一点要特别清楚,, ps:在PHP windows也可以用/表 ...
- Windows 和 Linux 下 禁止ping的方法
Windows 和Linux 下 禁止ping的方法 目的: 禁止网络上的其他主机或服务器ping自己的服务器 运行环境: Windows 03.08 linux 方法: Windows 03下: ...
- windows和linux下关闭Tomcat进程
windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...
- HDP2.0.6+hadoop2.2.0+eclipse(windows和linux下)调试环境搭建
花了好几天,搭建好windows和linux下连接HDP集群的调试环境,在此记录一下 hadoop2.2.0的版本比hadoop0.x和hadoop1.x结构变化很大,没有eclipse-hadoop ...
- windows下的java项目打jar分别编写在windows与linux下运行的脚本( 本人亲测可用!)
前言: 最近公司做了一个工具,要将这个工具打包成一个可运行的程序,编写start.bat和start.sh在windows和linux下都可以运行. 在网上找了很多资料,最后终于找到一个可靠的资料,记 ...
- Windows和Linux下通用的线程接口
对于多线程开发,Linux下有pthread线程库,使用起来比较方便,而Windows没有,对于涉及到多线程的跨平台代码开发,会带来不便.这里参考网络上的一些文章,整理了在Windows和Linux下 ...
- windows和linux下杀死Tomcat进程,解决端口占用
windows和linux下解决Tomcat进程 windows下启动Tomcat报错,8080端口号被占用,报错信息如下 两种解决方法,一种是关闭了这个端口号,另外一种是修改Tomcat下的serv ...
随机推荐
- UISearchBar去除底部黑线问题
有时我们在设置搜索框的时候底部会出现一条黑线,要 去除这黑线只需设置. [self.searchBar setBackgroundImage:[UIImage new]];
- c++,基类声明的指针变量和引用类型变量可以指向派 生类的对象
基类声明的指针变量和引用类型变量可以指向派生类的对象,而反过来派生类的指针却不能指向基类变量. 这与基类和派生类之间,被允许的赋值方向是相反的. 但是从逻辑上很容易推敲其合理性.
- matlab绘图方法汇总
Matlab画图 强大的画图功能是Matlab的特点之中的一个,Matlab提供了一系列的画图函数,用户不须要过多的考虑画图的细节,仅仅须要给出一些基本參数就能得到所需图形,这类函数称为高层画图函数. ...
- Xcode4.5 本地化,多语言设置
网上已有很多关于ios本地化的博客和资料,由于部分原作者使用的Xcode版本较早,4.5以后的版本已不再支持该方法,后来也没有更新,因此在此写一点学习资料分享出来.废话不多说. ios本地化主 ...
- 组件接口(API)设计指南-文件夹
组件接口(API)设计指南-文件夹 组件接口(API)设计指南[1]-要考虑的问题 组件接口(API)设计指南[2]-类接口(class interface) 组件接口(API)设计指南[3]-托付( ...
- 由于物化视图定义为on commit导致update更新基表慢的解决方案
由于物化视图定义为on commit导致update更新基表慢的解决方案 以下是模拟和解决测试过程: (模拟update慢的过程) 1.首先基于基表创建物化视图日志: create materiali ...
- libvirt(virsh命令总结)
virsh回车进入交互式界面: version pwd hostname 显示本节点主机名 nodeinfo 显示节点信息 list --all 显示所有云主机 7种状态: running 运行中 ...
- 另外一种方式装win2008r2
装系统有很多方法,但是这种,我很少用. 注意第二个红圈处,是要启动的电话引导盘符.容易选择你的启动U盘,如果是后者,表现出的结果就是引导U盘不能引导,且安装的电脑也会显示ntdl丢失.当然,也可以解决 ...
- xcode4.5.1、iphone5、ios6 使用记录
链接地址:http://blog.sina.com.cn/s/blog_6123f9650101dmo7.html 1.修改工程名:直接选中工程名点一下,就像修改名称夹名称一样简单了. 2.导入旧 ...
- BZOJ 1260: [CQOI2007]涂色paint( 区间dp )
区间dp.. dp( l , r ) 表示让 [ l , r ] 这个区间都变成目标颜色的最少涂色次数. 考虑转移 : l == r 则 dp( l , r ) = 1 ( 显然 ) s[ l ] = ...