Windows下程式向Linux下移植細節

工程師WWW發表於2013-11-04

【摘要】

根據zxms80專案的會議排程模組移植的經驗,本文提出了Windows平臺上程式向Linux下移植所碰到的一些典型問題,並舉例給出了相應的解決方法,文中還描述了使用pwlib庫時makefile檔案的編寫方法,該方法也適用於不使用pwlib庫開發時的一般情況,供要進行移植的同仁參考之用。

    <wbr><wbr><wbr><wbr>作者部落格:http://blog.csdn.net/wenhm/

一、問題的提出

    在程式設計師中有這樣一個說法,若一個程式不能移植到<wbr><wbr><wbr>Linux下,那這個程式將看不到未來。

由於Linux作業系統原始碼公開是的,開發庫等輔助工具都是原始碼公開的,這樣就減少了程式的不可預知性,而且出現錯誤可以大家一起修正、完善,而Windows平臺下所有的作業系統Api就給了個介面,即使出現莫名奇妙的錯誤也只能望著介面興嘆了。再加上Linux作業系統本身和它上面的許多工具軟體是免費的,更是吸引了更多的公司和程式開發人員將程式開發轉向Linux

在程式跨平臺的移植過程中,將存在作業系統API的不同、檔名大小寫識別不同、路徑分隔符不同、不同開發平臺資料型別的不一致等較一般性的問題。對於這些一般性的問題怎樣很好的來解決呢?Linux下的工程都是使用makefile檔案來管理的,怎樣編寫出相應的makefile檔案呢?這些問題都是本文後面將要闡述的。

二、解決思路

   本文撰寫的目的是為了提供<wbr><wbr>Windows平臺上程式向Linux下移植所碰到的一些典型問題及相應的解決方法,供要進行程式平臺移植的同仁參考之用。

文中還描述了使用pwlib庫時makefile檔案的編寫方法,對於使用了pwlib庫進行開發的程式能快捷的建立makefile工程檔案,避免了自己手動書寫makefile的繁雜工作。

特別是<3.2.6可以移植的資料型別>一節中對於不同開發平臺資料型別的不一致提出了一個簡捷通用的解決方法,不用修改源程式中任何程式碼即可在Linux下使用Windows開發平臺上的一些資料型別。

三、實踐情況

3.1.Makefile的編寫

       Linux<wbr><wbr><wbr><wbr><wbr><wbr>下一般都是使用make工具來管理和編譯一個大的開發工程的所有原始檔,make命令執行時,需要一個Makefile <wbr>檔案,以告訴make命令需要怎麼樣的去編譯和連結程式makefile關係到了整個工程的編譯規則。一個工程中的原始檔不計其數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更復雜的功能操作,因為makefile就像一個Shell指令碼一樣,其中也可以執行作業系統的命令。在Windows的一些IDEVC中將自動幫你生成相應的makefile,所有這些都是透明的,但在Linux下你就不能不自己寫makefile了,會不會寫makefile,從一個側面說明了一個人是否具備完成大型工程的能力。

     make<wbr><wbr><wbr><wbr>工具採用增量編譯的方式,每次只編譯被改動過確實需要編譯的原始檔,每次編譯時make工具將自動判斷那些原始檔需要重新編譯,當一個工程很大而又只改動了很少的幾個原始檔,這將節省很多時間。

具體makefile檔案的編寫規則可以檢視makeman <wbr>info文件(Linux命令列方式下輸入:man make <wbr>info make)makefile檔案的編寫規則很多,重要的是怎樣使用最簡單的方式寫出我們自己需要的makefile檔案。

    網上也有很多介紹資料,網上有一篇很好的介紹<wbr><wbr><wbr>makefile檔案編寫的文章:

 <wbr>

下文將著重介紹使用pwlib開發庫的工程的makefile的編寫,但對於其它工程只需將common.mak檔案中對pwlib庫進行編譯的指令碼去掉也可適用。

3.1.1使用pwlib開發庫的工程的makefile的編寫

PWLibPortable Windows Library的縮寫,翻譯為輕便的Windows類庫.PWLib採用C++編寫,設計初衷是為了能讓Openh323WindowsUnixX-Windows下執行<wbr>不過隨著一步步的完善PWLib已經被跨平臺的程式所廣泛採用。

檢視Pwlib的主目錄下/samples/hello_world/目錄下例子程式的makefile檔案可以發現該Makefile檔案內容如下:

# Simple makefile for the hello world program

PROG    = hello<wbr><wbr><wbr><wbr>

SOURCES = hello.cxx

ifndef PWLIBDIR

PWLIBDIR=$(HOME)/pwlib

endif

include $(PWLIBDIR)/make/ptlib.mak

# End of Makefile

實際上就是使用了Pwlib庫的ptlib.mak檔案,編譯時需要的標頭檔案,相應的編譯選項都在ptlib.mak檔案中設定好了。

我們只需在該makefile檔案所在目錄下,命令列輸入make all命令即可編譯出程式的Release版本和Debug版本,它們分別放在當前目錄的obj_linux_x86_robj_linux_x86_d子目錄下。

下面對該makefile中的內容進行解釋:

l         <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>PROG變數為編譯出來的程式名稱。

l         <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>SOURCES變數儲存的為本工程要進行編譯和連結的原始檔,當有多個原始檔時可以用空格隔開,雖然檔名可以帶上路徑,但路徑在SOURCES變數中不起作用,實際編譯時對於每個檔案它將截掉最後一個”/”字元前面的所有內容只保留檔名。

l         <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>PWLIBDIRpwlib的安裝目錄,需要設定該環境變數(若要系統每次重啟都自動設定好該環境變數則將該環境變數的設定放入/etc/profile檔案中),若沒設定好則自動以使用者主目錄/pwlib”作為pwlib的安裝目錄。

3.1.2深入分析ptlib.mak檔案

分析ptlib.mak檔案,它的內容如下;

ifndef PWLIBDIR

PWLIBDIR=$(HOME)/pwlib

endif

 <wbr>

include $(PWLIBDIR)/make/unix.mak

include $(PWLIBDIR)/make/common.mak

也就是ptlib.mak包含了另兩個檔案unix.makcommon.mak檔案,其中unix.mak為定義編譯選項變數的檔案,編譯規則放在common.mak檔案中。

通過對這兩個檔案的分析,歸納出一些我們寫makefile檔案要用到的一些變數,列出如下:

l         <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>STDCCFLAGS:所有標頭檔案的include目錄編譯選項、預編譯巨集定義選項、警告選項、優化選項都放在該變數中,各編譯選項之間用空格分開。

l         <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>LDFLAGS:共享庫、靜態庫搜尋目錄設定放入該變數中。

l         <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>LDLIBS:連結時要用的庫的設定放入該變數中。

l         <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>VPATH_CXX*.cxx原始檔的搜尋路徑放入該變數中,多個目錄以空格分開,編譯時將首先在makefile所在目錄查詢相應原始檔,沒找到則按照VPATH_CXX中的路徑設定進行查詢。

l         <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>VPATH_C*.c原始檔的搜尋路徑放入該變數中,多個目錄以空格分開,檔案查詢順序和VPATH_CXX變數的類似。

3.1.3加入新的編譯規則

common.mak檔案中只對*.c*.cxx的原始檔定義了編譯規則,而一般windows下程式大多都使用了.cpp來作為C++原始檔的字尾。

怎樣加入對於.cpp字尾的原始檔的編譯規則呢,這需要修改pwlibcommon.mak檔案,具體步驟如下:

       1<wbr><wbr><wbr><wbr><wbr><wbr><wbr>.加入對於.cpp檔案的搜尋目錄設定

vpath %.cxx $(VPATH_CXX)語句後面加入如下語句:

              vpath %.cpp $(VPATH_CXX)<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

       2<wbr><wbr><wbr><wbr><wbr><wbr><wbr>.加入對於.cpp檔案的編譯規則

              <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>$(OBJDIR)/%.o : %.cxx語句的前面加入如下語句:

$(OBJDIR)/%.o : %.cpp

       @if [ ! -d $(OBJDIR) ] ; then mkdir -p $(OBJDIR) ; fi<wbr><wbr><wbr><wbr><wbr><wbr><wbr>

       $(CPLUS) $(STDCCFLAGS) $(OPTCCFLAGS) $(CFLAGS) $(STDCXXFLAGS) -x c++ -c $< -o $@<wbr><wbr><wbr><wbr><wbr><wbr><wbr>

       3<wbr><wbr><wbr><wbr><wbr><wbr><wbr>.加入對於.cpp檔案的.o檔案(目的碼檔案)的命名規則

       <wbr><wbr><wbr><wbr><wbr><wbr><wbr>SRC_OBJS := $(SRC_OBJS:.cxx=.o)語句後面加入如下語句

SRC_OBJS := $(SRC_OBJS:.cpp=.o)

       4<wbr><wbr><wbr><wbr><wbr><wbr><wbr>.加入對於.cpp檔案的.dep檔案(依賴檔案)的命名規則

       <wbr><wbr><wbr><wbr><wbr><wbr><wbr>SRC_DEPS := $(SRC_DEPS:.cxx=.dep)語句後面加入如下語句

SRC_DEPS := $(SRC_DEPS:.cpp=.dep)

       5<wbr><wbr><wbr><wbr><wbr><wbr><wbr>.加入對於.cpp檔案生成.dep檔案的生成規則,加入如下語句:

       <wbr><wbr><wbr><wbr><wbr><wbr><wbr>$(DEPDIR)/%.dep : %.cxx語句前面加入如下語句

$(DEPDIR)/%.dep : %.cpp

       @if [ ! -d $(DEPDIR) ] ; then mkdir -p $(DEPDIR) ; fi<wbr><wbr><wbr><wbr><wbr><wbr><wbr>

       @printf %s $(OBJDIR) > $@<wbr><wbr><wbr><wbr><wbr><wbr><wbr>

       $(CPLUS) $(STDCCFLAGS:-g=) -M $< >> $@<wbr><wbr><wbr><wbr><wbr><wbr><wbr>

3.1.4一個makefile範例

 <wbr>

 <wbr>

 <wbr>


3.2.程式的移植

    進行程式移植的過程中碰到的問題較多,但大都主要集中在檔名大小寫、路徑分隔符、資料型別等方面。<wbr><wbr><wbr>

3.2.1LinuxWindows作業系統API差異

Windows下基於MFCAPI、基於訊息的API、基於登錄檔的API等在Linux下都是沒有的,由於檔案系統的差異,和檔案系統相關的API也是不可以移植的。

解決方法:程式中不使用上面所列的不可移植的作業系統API,通過使用開源庫如PWLIBACE中的可移植的類來實現所需的功能。

如:

SYSTEMTIME pTime;

GetLocalTime(&pTime);       //<wbr><wbr><wbr><wbr><wbr><wbr><wbr>windows獨有的API

sprintf(sTemp,"[.2d-.2d-.2d].2d:.2d:.2d %s(%d)",

pTime.wYear,pTime.wMonth,pTime.wDay,

                  pTime.wHour,pTime.wMinute,pTime.wSecond,file,lineNum);<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

改為:

使用pwlibPTime來實現

PTime curTime;                   //pwlib<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>中可以跨平臺使用的時間類

sprintf(sTemp,"[.2d-.2d-.2d].2d:.2d:.2d %s(%d)",

                   curTime.GetYear(), curTime.GetMonth(), curTime.GetDay(),<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

                            curTime.GetHour(), curTime.GetMinute(), curTime.GetSecond(), file, lineNum);<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

 <wbr>

3.2.2開發庫函式的差異

    一些函式在<wbr><wbr><wbr>Windows作業系統的VC開發庫中有,但Linux下的GLIB C開發庫中沒有或是名字不一樣。

      Windows<wbr><wbr><wbr><wbr><wbr>下有而Linux下開發庫沒有的函式,例如: itoa(int, <wbr><wbr>char *, int)<wbr>ltoa(long, <wbr>char *, int)<wbr>ultoa(unsigned long,<wbr>char *, int)<wbr>等。

解決方法1:通過編寫相應的程式碼來實現該函式。

解決方法2:使用Linux下含有類似功能的函式來替換,如itoa()ltoa()等系列的函式都可以通過sprintf()snprintf()函式來替換

替換例子1

       ltoa( confHistb.conflong, caTemp, 10 );<wbr><wbr><wbr><wbr><wbr><wbr>

可以替換為:

#ifdef <wbr>WIN32    <wbr><wbr><wbr><wbr>//windows

                            ltoa( confHistb.conflong, caTemp, 10 );<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

#else          <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>                   <wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//linux

                   sprintf(caTemp, "%d", confHistb.conflong);<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

#endif    <wbr><wbr><wbr><wbr>

或直接用sprintf(caTemp, "%d", confHistb.conflong);替換即可。

2WindowsSleep()函式對應的Linux下函式為sleep()usleep(),要特別注意的是WindowsSleep()為休眠多少毫秒,而sleep()usleep()分別為休眠多少秒和微妙,所以替換的時候不僅要注意函式的名稱不同還要注意單位的不一致。

3Windowsstricmp()函式在Linux下對應的為strcasecmp()函式,可以通過巨集定義來區分不同平臺的程式碼,也可以在WINTYPES.H檔案中加入如下語句:

#define stricmp strcasecmp

通過巨集替換來實現。

3.2.3Linux下對檔名大小寫敏感

Windows下由於作業系統對檔名大小寫不明感,#include語句中檔名的大小寫均可以,而Linux作業系統是對檔名大小寫敏感的,#include語句中的檔名必須和原檔名大小寫一模一樣才能找到。

解決方法:#include語句中檔名和原檔名大小寫不一致的全部要修改為一致。

 <wbr>

3.2.4Linux下路徑中各目錄的分隔符只能為”/”

Windows下路徑的分隔符使用”/”和“/“均可,而Linux下只能使用”/“來作為路徑中個目錄的分隔符。

解決方法:#include語句中路徑的分隔符全部使用“/”

 <wbr>

資料型別

3.2.5程式裡不能使用Windows特有的資料型別

例如:FAR PASCALHWNDHMENUHFONT等,因為這些型別在Linux下無法找到替代它們的型別,必然導致程式的不可移植。

3.2.6可以移植的資料型別

有些資料型別是可以通過型別定義來實現的,如CHARLONGINTINT32FLOATBOOLVOIDUCHARCONSTWINAPICALLBACK等,這些型別在Windows下的VC開發庫中定義了,但在Linux下沒有。

解決方法:可以通過建立一個 WINTYPES.H<wbr>的標頭檔案,將這些型別定義放在該檔案裡。

編譯時加上“-include  PATH/WTYPES.H<wbr><wbr>”編譯選項即可不用在程式碼中加入任何“#include”語句而使用WINTYPES.H中的型別,這裡的PATHWINTYPES.H檔案所在的路徑。示例程式碼如下:

typedef float FLOAT;

typedef char CHAR;

#define VOID         void<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

#define WINAPI      __attribute__((stdcall))<wbr><wbr><wbr><wbr><wbr><wbr>

#define CALLBACK  __attribute__((stdcall))<wbr><wbr>

3.2.7一些巨集定義Windows下有而Linux下沒有

有些巨集定義如:

#define <wbr>MAKEWORD(a, b)      ((WORD)(((BYTE)(a)) | ((WORD)((BYTE)(b))) << 8))<wbr><wbr><wbr><wbr><wbr><wbr>

#define <wbr>MAKELONG(a, b)      ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))<wbr><wbr><wbr><wbr><wbr><wbr>

#define <wbr>LOWORD(l)           ((WORD)(l))<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

#define <wbr>HIWORD(l)           ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

#define <wbr>LOBYTE(w)           ((BYTE)(w))<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

#define <wbr>HIBYTE(w)           ((BYTE)(((WORD)(w) >> 8) & 0xFF))<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

等在Windows下有,而Linux下沒有。

解決方法:在使用到這類巨集定義時將相應的巨集定義放入WINTYPES.H檔案中即可。

 <wbr>

3.2.8同名但結構不同的資料型別

Winowsstruct in_addr<wbr>結構定義如下:

struct in_addr {

        union {<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

                struct { u_short s_w1,s_w2; } S_un_w;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

                u_long S_addr;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

        } S_un;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

};

      <wbr><wbr><wbr><wbr><wbr><wbr>Linuxstruct in_addr<wbr>結構定義為:

struct in_addr

{

__u32 s_addr;

};

解決方法:因在使用這種型別的時候不同作業系統下面的程式碼不一樣,要使用巨集定義將不同作業系統下的程式碼分開。

例:

#ifdef <wbr>WIN32

              ipAdd.S_un.S_addr = address_ip;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

#else

              ipAdd.s_addr = address_ip;<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>

#endif

巨集定義WIN32WindowsVC編譯器自帶的一個巨集定義,該巨集定義在Linux下不存在所以在Windows下和Linux下使用的程式碼是不同的。

3.2.9Windows下的標頭檔案Linux下名字不同

有些標頭檔案在Windows下和Linux下名字不一樣,如strstrea.hLinux下對應的檔名為sstream <wbr>strstream

解決方法:當發現以後寫標頭檔案在Linux下找不到時,檢視下是否Linux相應標頭檔案的名字不一樣,是否開發庫的不同版本標頭檔案不一樣,有些開發庫如STL開發庫由於不斷升級會淘汰一些標頭檔案而使用其它的標頭檔案來進行替代。

       <wbr><wbr><wbr><wbr><wbr><wbr><wbr>所以

#include <wbr>

修改為:

#ifdef <wbr>WIN32 <wbr>//windows

       <wbr><wbr><wbr><wbr><wbr><wbr><wbr>#include <wbr>

#else       <wbr><wbr><wbr><wbr><wbr><wbr><wbr>       <wbr><wbr><wbr><wbr><wbr><wbr><wbr>//linux

       <wbr><wbr><wbr><wbr><wbr><wbr><wbr>#include <wbr>

       <wbr><wbr><wbr><wbr><wbr><wbr><wbr>#include <wbr>

#endif

 <wbr>

3.2.10WindowsLinux下編譯器對語言理解的差異

由於編譯器的差異也導致要將不同平臺下的程式碼要使用巨集定義來區分開,如:

for(int i=0; i< iSize; i++)

語句定義的變數iWindows下該變數將在for語句執行完後仍有效,而在Linux下變數i只在for語句內部有效出了for語句的範圍後就失效了。

解決方法:這種情況是由於編譯器對語言語義上的理解不同導致的,只要看下編譯的錯誤資訊就可以很快解決,要注意的時要使用巨集定義來包含不同平臺之間的程式碼。

 <wbr>

3.2.11Linux下編譯器檢查比WindowsVC的編譯器檢查更嚴格

Linux下的編譯器檢查比Windows下更嚴格,特別是型別轉換檢查方面,如:

char strTime=2004/01/02 14:00:00

PTime starttime = strTime;

windows下編譯可以通過,但由於PTime類只有PTime(const PString & str  )<wbr><wbr>建構函式,而strTimechar[]型別,雖然在Windows下可以編譯通過但在Linux下編譯通不過

解決方法:增加強制型別轉換即可。

char strTime=2004/01/02 14:00:00

PTime starttime = Pstring(strTime);

這方面的程式碼編譯錯誤只要看下編譯的錯誤資訊也可以很快就解決。由於是Linux下編譯器檢查比Windows下嚴格,所以只要能保證在Linux下編譯通過Windows下肯定也能編譯通過不用使用巨集定義來包含不同平臺之間的程式碼。

 <wbr>

四、效果評價

以上所列移植的問題是在進行zxms80專案 <wbr>CSS(會議排程模組)移植時碰到的,CSS模組採用pwlibptlib,mak檔案來建立makefile檔案,採用了前面所列的解決方法來解決碰到的問題,整個移植過程花了一個月左右。(CSS程式碼大概40000行左右,使用了Pwlib庫、ACE+TAO庫、Libodbc++)

通過借用pwlibptlib.mak檔案可以快捷的建立自己的makefile檔案,建立出來的makefile簡單易讀。

Windows下程式往Linux下移植主要就是會碰到上面列出來的一些問題,文中為每類問題都進行了舉例和提供了相應的解決方案希望對要進行程式平臺移植的同仁會有所裨益。

五、推廣建議

並不是任何程式都可以輕鬆進行移植的,只有在設計、開發初期考慮到程式的可移植性,使用了可移植的開發庫來進行開發,儘量避免使用和平臺相關的程式碼,這樣的程式才能快速、方便的進行移植。

文中描述的移植中碰到的問題和解決方法對於Windows平臺下C/C++程式向Linux平臺移植均適用,特別是對於使用了pwlib庫來進行開發的程式提出了快捷的建立makefile工程檔案的方法,並對makefile檔案的關鍵部分進行了解釋,最後給出了一個makefile檔案的完整範例。即使是沒有使用pwlib開發庫也可以使用pwlib的相應make檔案來構建自己的makefile檔案,只是需要將相應編譯pwlib庫的那部分指令碼(common.mak檔案中)遮蔽掉就可用於建立任何工程的makefile檔案。

只要使用了可移植的開發庫來開發大部分程式碼,移植過程還是比較順利的,主要是一些如檔名大小寫、路徑分隔符使用不對等小問題的重複修正,若是使用了很多和Windows Api相關的程式碼如訪問登錄檔、檔案操作的Api則要費些功夫來重寫這部分程式碼了。

通過對程式進行移植操作,一定更能深刻體會寫程式碼時為什麼要注意可移植性了,不能一味的為了方便使用簡單而不可移植的方法來實現。


參考資料

1.       <wbr><wbr><wbr><wbr><wbr><wbr><wbr>王華等Linux從入門到精通中國水利水電出版社20009月第一版北京第一次印刷。

2.       <wbr><wbr><wbr><wbr><wbr><wbr><wbr>Stephen Figgins, Ellen Siever, Aaron Weber<wbr><wbr><wbr>LPI Linux Certification in a NutshellPublisher : O'ReillyJune 2003

http://www.us1.openh323.org/

相關文章