Linux Ubuntu下 靜態編譯Qt程式

2021-06-23 04:36:54 字數 2999 閱讀 5404

專案需要,原來在windows平台動態編譯程式,使用nsis指令碼,找到動態鏈結庫,再使用打包軟體,打包即可發布。現在平台轉到了ubuntu,動態編譯的話需要ldd ***(可執行程式),將所需要的動態庫打包。覺得麻煩,不如直接靜態編譯類庫,再用靜態庫編譯即可一勞永逸。

一、靜態編譯與動態編譯的區別

動態編譯的可執行檔案需要附帶乙個的動態鏈結庫,在執行時,需要呼叫其對應動態鏈結庫中的命令。所以其優點一方面是縮小了執行檔案本身的體積,另一方面是加快了編譯速度,節省了系統資源。缺點一是哪怕是很簡單的程式,只用到了鏈結庫中的一兩條命令,也需要附帶乙個相對龐大的鏈結庫;二是如果其他計算機上沒有安裝對應的執行庫,則用動態編譯的可執行檔案就不能執行。、

靜態編譯就是編譯器在編譯可執行檔案的時候,將可執行檔案需要呼叫的對應動態鏈結庫(.so)中的部分提取出來,鏈結到可執行檔案中去,使可執行檔案在執行的時候不依賴於動態鏈結庫。所以其優缺點與動態編譯的可執行檔案正好互補。

二、一般情況下,我們用qt編譯出來的程式是要依賴於系統qt庫的,也就是這個程式移到別的沒有安裝qt庫的系統上是不能使用的。會提示缺少……庫檔案之類的錯誤。這就是動態編譯的結果。但是如果我們想編譯乙個程式,這個程式在發給別人後,他們可以直接開啟,而不需要特別地去先安裝qt庫,那就需要採用靜態編譯了。在linux下如何靜態編譯qt程式呢?

首先需要先安裝靜態編譯的qt,也就是靜態編譯qt程式首先是需要乙個靜態編譯安裝的qt

2、解壓到某一目錄

3、cd 進入解壓後的目錄,命令:

./configure -static -release -qt-zlib -qt-gif -qt-libpng-qt-libmng -qt-libjpeg -nomake demos -nomake examples-qt-sql-sqlite -prefix/usr/local/nokia/qt-4.8.3_static

引數-static 指的是要採用靜態編譯qt的方法

引數-release指的是只編譯release版本的庫

引數-qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libjpeg是更好確定qt編譯出的程式能在目前不知的系統下執行。

引數-nomake demos -nomake examples 指的是不編譯demos和examples

引數-qt-sql-sqlite 如果沒有這個引數,configure的時候,可能會提示sqlite 有問題而中止。

引數 -prefix /usr/local/nokia/qt-4.8.3_static指明靜態編譯的qt安裝的目錄,命名nokia/qt-4.8.3_static是為了區別動態編譯安裝的qt,因為如果沒有這個引數,安裝時會覆蓋之前動態編譯安裝的qt(如果有的話)。

4、沒問題後

make

5、make沒問題後再

sudo make install

6、增加(或改變)環境變數:

在你home目錄下你的的名字的目錄中,在.profile檔案中追加(或改變)如下環境變數:(為qt設定一些特定的環境變數,這個很重要!.profile檔案是隱藏的,可在你的名字目錄下,按ctrl+h顯示所有檔案檢視到)

qtdir=/usr/local/nokia/qt-4.7.3_static/

path=$qtdir/bin:$path

manpath=$qtdir/doc/man:$manpath

ld_library_path=$qtdir/lib:$ld_library_path

export qtdir path manpathld_library_path

qtdir=/usr/local/trolltech/qt-4.5.1_static/

path=$qtdir/bin:$path

manpath=$qtdir/doc/man:$manpath

ld_library_path=$qtdir/lib:$ld_library_path

export qtdir path manpathld_library_path

7、重啟,在qtcreator中配置編譯器,kit即可。

8、在終端測試一下qmake

成功的話,下來用qmake編譯出的qt程式就是採用靜態編譯的。這時你會發現,靜態編譯出來的程式大小變大了相當多。

Linux Ubuntu 下進行C的多檔案編寫

本篇介紹如何在linux的vim編譯器下進行多檔案的拆分和合併編譯。這裡以交換a,b的值失敗的程式為例,以便於後面以交換成功的的程式來說明指標問題。現在就是要把change 函式和main 函式分到兩個檔案中。編譯執行main.c檔案 在vim編譯器上同時開啟多個檔案 命令模式下輸入 sp 檔名 4...

靜態聯編與動態聯編

在c 中,多型性主要是通過函式過載實現的。過載函式是指程式中對同名函式進行呼叫時,編譯器會根據函式引數的型別和個數,決定該呼叫哪一段函式 來處理這個函式呼叫。這種把函式呼叫與適當的函式 相對應的動作,叫做聯編。聯編分為靜態聯編和動態聯編。在編譯階段決定執行哪個同名的被呼叫函式,稱為靜態聯編。在編譯階...

靜態聯編和動態聯編

聯編是指乙個電腦程式自身彼此關聯 使乙個 源程式經過編譯 連線,成為乙個可執行程式 的過程,在這個聯編過程中,需要確定程式中的操作呼叫 函式呼叫 與執行該操作 函式 的 段之間的對映關係,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。靜態聯編 呼叫函式和被調函式在程式編譯時,他們在記憶體中的位...