1. 程式人生 > >Windows下程式向Linux下移植細節

Windows下程式向Linux下移植細節

【摘要】

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

一、問題的提出

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

由於Linux作業系統原始碼公開是的,開發庫等輔助工具都是原始碼公開的,這樣就減少了程式的不可預知性,而且出現錯誤可以大家一起修正、完善,而Windows平臺下所有的作業系統

Api就給了個介面,即使出現莫名奇妙的錯誤也只能望著介面興嘆了。再加上Linux作業系統本身和它上面的許多工具軟體是免費的,更是吸引了更多的公司和程式開發人員將程式開發轉向Linux

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

二、解決思路

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

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

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

三、實踐情況

3.1.Makefile的編寫

       Linux下一般都是使用make工具來管理和編譯一個大的開發工程的所有原始檔,make命令執行時,需要一個Makefile 

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

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

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

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

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

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

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

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

# Simple makefile for the hello world program

PROG    = hello

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中的內容進行解釋:

lPROG變數為編譯出來的程式名稱。

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

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

3.1.2深入分析ptlib.mak檔案

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

ifndef PWLIBDIR

PWLIBDIR=$(HOME)/pwlib

endif

include $(PWLIBDIR)/make/unix.mak

include $(PWLIBDIR)/make/common.mak

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

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

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

lLDFLAGS:共享庫、靜態庫搜尋目錄設定放入該變數中。

lLDLIBS:連結時要用的庫的設定放入該變數中。

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

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

3.1.3加入新的編譯規則

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

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

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

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

              vpath %.cpp $(VPATH_CXX)

相關推薦

Windows程式Linux移植細節

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

WindowsLinux程式碼移植常見問題

前幾天完成了一次Windows向Linux的程式碼移植,由於在Windows上開發時沒有考慮到相容性,所以移植的時候還是碰到了不少的問題,今天專門抽時間把問題和解決方法整理出來,作為經驗,以備將來查閱。 1. 包含的標頭檔案名稱大小寫問題 例如 [plain] 

使程式Linux後臺執行 (關掉終端繼續讓程式執行的方法)

一、為什麼要使程式在後臺執行 我們計算的程式都是週期很長的,通常要幾個小時甚至一個星期。我們用的環境是用putty遠端連線到日本Linux伺服器。所以使程式在後臺跑有以下三個好處: 1:我們這邊是否關機不影響日本那邊的程式執行。(不會像以前那樣,我們這網路一斷開,或一關機,程式就

windowsPLsql連Linux的Oracle

1.首先先確定你的Oracle在linux環境下可以執行 用 Oracle 使用者 遠端登入, 然後 輸入: $ sqlplus / nolog SQL> conn / as sysdba 2.可以成功執行之後去oracle官方網站下載instantclient-basic-win32-x

qt程式linux打包釋出

       僅做記錄,防止忘記:        1、linux下複製qt release模式生成的可執行檔案到桌面的新建目錄。        2、編寫指令碼檔案ldd.sh  作用:匯出可執行程式執行時所需要的庫檔案  點選下載。         3、執行 ./ldd

windowsplsql連線linux的oracle資料庫

首先先確定你的Oracle在linux環境下可以執行 用 Oracle 使用者 遠端登入, 然後 輸入: $ sqlplus / nolog SQL> conn / as sysdba 可以成功執行之後去oracle官方網站下載instantclient-basic

使程式Linux後臺執行,程式執行前後臺切換

一、為什麼要使程式在後臺執行 我們計算的程式都是週期很長的,通常要幾個小時甚至一個星期。我們用的環境是用Xshell遠端連線到Linux伺服器。所以使程式在後臺跑有以下兩個好處: 1:我們這邊是否關機不影響伺服器的程式執行。(不會像以前那樣,我們這網

Qt 程式linux的釋出

在Ubuntu上,通過執行lddmyapp可以檢視應用程式依賴的動態連結庫,在=>後顯示”notfound”的動態連結庫就是需要複製的動態連結庫,例如: libQt5Widgets.so.5=>not found 將缺失的動態庫複製到應用程式目錄後,由於實際的動

提效技巧 | PHP程式執行Linux的SVN命令

在專案開發中,因為是內網伺服器(本文操作操作環境:Centos 6.5+PHP 7),每次更新都需要連上VPN才能svn up更新程式碼。周而復始的操作浪費了大量的開發時間,故決定用PHP實現通過訪問url的方式來更新服務端的程式碼版本。 網上也看到了很多寫法

window檔案在Linux檔案亂碼解決

在使用iconv轉換檔案的字元編碼時,如果遇到類似“iconv: illegal input sequence at position”的錯誤,原因是需要轉換的字元編碼沒有涵蓋檔案中的字元,比如,將一個簡體中文的GB2312的檔案轉換為BIG5的編碼,而在繁體編碼的BIG5裡面,不包含很多的簡體中文字元,所以

分享 :去掉linux git push時…

在~/下, touch建立檔案 .git-credentials, 用vim編輯此檔案,輸入內容格式: [email protected] ~ $touch .git-credentials [email protected] ~ $vim .git-credentials 在

windows環境中linux環境中orale資料庫中匯入dmp檔案

1.從本地上開啟遠端連線SecureCRT連線虛擬機器 2.進入oracle使用者下 3.輸入命令 imp sys/[email protected]:1521/ORCL file= D:\表名.dmp tables=表名 在這裡D:\

window工具訪問linuxmysql出現 error no 2003 10061錯誤的解決辦法

1、檢視:netstat -an|grep 3306 是空的,說明沒有在偵聽           解決辦法:修改/etc/my.cnf 將其中skip-networking註釋掉,然後執行netstat -an|grep 3306 就可以看到了 2、對於伺服器來說,

Windows開發平臺Linux平臺轉移的一些想法

一次 準備 畢業 服務器 掃描 美國 安全 visual pro   從畢業到現在已經快20年了,一直在從事Windows平臺上的開發工作。剛畢業那會大約是97,98年左右,工作的平臺除了Windows平臺還有Dos平臺,因為在學校學習時,也是從Dos開始的。因此對於從事D

Socket程式Windows移植Linux的一些注意事項

轉載標明出處:http://www.linuxidc.com/Linux/2008-10/16410.htm 關於這個話題網上流傳的是一個相同的版本,就是那個第一項是標頭檔案的區別,但後面列出的標頭檔案只有#include沒有(估計是原版的在不斷轉載的過程中有人不小心忘

[轉載][old] linux 通過wine 執行windows程式包括IE

一、相關說明 Ubuntu9.10 舉例(因為它方便,N多東西直接線上安裝,省得編譯了),其他linux基本相同(不同的就是有些要進行原始碼安裝,但用到的軟體是一樣的),整個安裝我以經做成指令碼放方便下載安裝不過指令碼寫的比較簡單沒有做太多判斷到這裡下載:http://download.csdn

Windows低頭,在Linux環境使用wine進行caj檔案的讀取

畢業設計確定題目,導致必須看一些題目相關的中文論文進行入門。學校只有知網庫,沒有萬方庫,所以只能去知網。知網全是caj檔案,可是沒有Linux平臺的caj閱讀器。試了各種只用Linux解決的辦法,發現都不行。沒辦法,裝wine,用虛擬方式執行Windows吧╮(╯_╰)╭ 三天前明明跟室友說

QtCreator程式的釋出:WindowsLinux

Windows下: 說明:使用Qt自帶工具“windeployqt.exe”來拷貝大部分的動態庫(*.dll),一般有以下兩種方法。 前提,將Qt編譯方式選為:Release,把編譯好的*exe檔案拷

windowslinux打包python程式

一、windows下用py2exe打包python程式生成exe檔案 1、py2exe是一種python釋出的打包工具,可以把python指令碼轉換成windows下的可執行程式,不需要安裝python便可執行。 2、首先需要安裝py2exe,我的python是2.7版本,

windowsLinux執行python程式的方法

1 在windows下執行python程式 1)從DOS命令列執行python指令碼   用python直譯器來執行python指令碼,在windows下面python直譯器是python.exe,我的python檔案安裝在D:\Python27,在這個目錄下可