怎樣在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) 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