偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

詳解編譯Windows平臺(tái)下靜態(tài)Qt庫

移動(dòng)開發(fā)
如何編譯在Windows平臺(tái)下實(shí)現(xiàn)真正意義上的靜態(tài)Qt庫是本文要介紹的內(nèi)容,在網(wǎng)上看到了這么一篇對(duì)大家有幫助的文章,與大家分享一下,具體內(nèi)容來看本文詳解。

如何編譯在Windows平臺(tái)下實(shí)現(xiàn)真正意義上的靜態(tài)Qt庫是本文要介紹的內(nèi)容,在網(wǎng)上看到了這么一篇對(duì)大家有幫助的文章,與大家分享一下。

編譯Windows平臺(tái)下靜態(tài)Qt庫是本文要介紹的內(nèi)容,我在國內(nèi)外Qt論壇上看到的最多的問題之一就是如何編譯靜態(tài)Qt庫,可見在動(dòng)態(tài)鏈接庫 (Windows: .dll, Linux: .so)大勢(shì)所趨的今天,靜態(tài)鏈接庫還是具有其存在的合理性和廣泛需求。首先看看動(dòng)態(tài)庫給我們帶來了什么:

1、開發(fā)時(shí)的復(fù)用性:成千上萬的各種實(shí)用庫,包含它們的頭文件,你就可以開始使用它們提供的功能;

2、編譯時(shí)的快捷化:進(jìn)行過靜態(tài)鏈接編譯的人都知道,其編譯過程的時(shí)間消耗是動(dòng)態(tài)鏈接的數(shù)倍倍甚至更多;

3、部署時(shí)的輕量化:如果你的程序使用操作系統(tǒng)自帶的動(dòng)態(tài)庫,或者是一些非常流行的庫。那么部署你的軟件時(shí),這些庫便可以不用包含在你的

4、packge里面,大大減小了其體積;

使用時(shí)的可維護(hù)性:某個(gè)庫如果發(fā)布了更新的版本,那么你只需替換這個(gè)動(dòng)態(tài)庫文件,而不需要重新編譯你的整個(gè)程序。

在如今這個(gè)時(shí)不時(shí)都需要給軟件打補(bǔ)丁的時(shí)代,這是相當(dāng)方便的。那么,她又會(huì)給我們帶來什么煩惱呢?軟件的易用性至上。所謂易用性,不單單指這個(gè)進(jìn)入了這個(gè)軟件后使用起來多么多么方便,使用之前的那些過程同樣也是易用性的一部分。

用過Linux的可能都會(huì)有同感,裝個(gè)軟件真難啊,一會(huì)兒提示缺這個(gè)so庫,一會(huì)兒這個(gè)so和那個(gè)so又不兼容了,還有甚者,你還需要在你的帳戶的配置文件里設(shè)置一大堆參數(shù)……還沒安裝完,就已經(jīng)放棄了使用這個(gè)軟件的念頭。我想,易用性的問題也是 Linux如此強(qiáng)大可是普及率遠(yuǎn)遠(yuǎn)不及Windows的根源吧,畢竟絕大多數(shù)的用戶需要的是一個(gè)傻瓜相機(jī)般的操作系統(tǒng)。

不過在Windows下,常常你也會(huì)遇到”某個(gè)dll無法找到,程序無法啟動(dòng)”、”需要.net framework”之類的提示之。懂點(diǎn)軟件知識(shí)的,還知道去下載這個(gè)缺失的dll庫或者是下載.net的再發(fā)行庫來安裝。但是這已經(jīng)大大違背了軟件易用性的原則,要知道軟件的受眾絕大多數(shù)都是與IT行業(yè)無關(guān)的人員,它們遇到這些問題時(shí)候便是束手就擒。

Visual Studio 2005后的版本更是不可理喻,它們編譯出來的C/C++程序,如果在沒有Visual Studio再發(fā)行庫的系統(tǒng)上運(yùn)行,直接提示”應(yīng)用程序沒有正確配置,重新安裝可能解決該問題”,簡直不知所云……

靜態(tài)鏈接的存在的合理性就在這里,一個(gè)可執(zhí)行文件部署給用戶,用戶什么都不用做,雙擊一下就可享用。至于編譯、維護(hù),那是開發(fā)者的事情,哪怕一次編譯要耗費(fèi)一天的時(shí)間,也不能浪費(fèi)用戶的時(shí)間去做一些對(duì)他來說不知所云而本可以在開發(fā)者的環(huán)節(jié)中完成的事情?;谝陨系男拍?,我研究了Windows下真正意義上的Qt靜態(tài)庫編譯方法。至于什么叫”真正意義上”,看了下文便知。

Visual Studio相關(guān)編譯選項(xiàng)

自己動(dòng)手編譯過Qt的人可能會(huì)覺得奇怪,拿這個(gè)問題來寫這么一大段,真是小題大作。Qt的配置選項(xiàng)中不是寫得清楚明白-static便是編譯靜態(tài)庫嗎??墒悄阌姓嬲囘^嗎,用這個(gè)靜態(tài)庫編譯的程序拿到一個(gè)”干凈”的機(jī)器上運(yùn)行,則提示”應(yīng)用程序沒有正確配置……”或是”msvcrpxx.dll”沒有找到。 看來Qt是靜態(tài)了,可是Qt是用C++寫的,其中鏈接的C++運(yùn)行庫還是動(dòng)態(tài)的。解決這個(gè)問題,要從Visual Studio的4個(gè)編譯選項(xiàng)說起,它們決定了程序在鏈接階段C/C++庫的鏈接方式。

1、鏈接C/C++多線程動(dòng)態(tài)庫,使用這些編譯選項(xiàng),軟件部署時(shí)需要VC的再發(fā)行庫,否則就會(huì)出現(xiàn)上述錯(cuò)誤提示。

/MD:動(dòng)態(tài)鏈接多線程庫(msvcrt.lib)。使用該選項(xiàng)時(shí),需要用/NODEFAULTLIB選項(xiàng)來忽略掉libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib庫,否則會(huì)有鏈接錯(cuò)誤;

/MDd:動(dòng)態(tài)鏈接多線程調(diào)試庫(msvcrtd.lib)。使用該選項(xiàng)時(shí),需要用/NODEFAULTLIB選項(xiàng)來忽略掉libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib庫,否則會(huì)有鏈接錯(cuò)誤;

2、鏈接C/C++多線程靜態(tài)庫,使用這些編譯選項(xiàng),軟件部署時(shí)不需要VC的再發(fā)行庫。

/MT:靜態(tài)鏈接多線程庫(libcmt.lib)。使用該選項(xiàng)時(shí),需要用/NODEFAULTLIB選項(xiàng)來忽略掉libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib庫,否則會(huì)有鏈接錯(cuò)誤;

/MTd:靜態(tài)鏈接多線程調(diào)試庫(libcmtd.lib)。使用該選項(xiàng)時(shí),需要用/NODEFAULTLIB選項(xiàng)來忽略掉libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib庫,否則會(huì)有鏈接錯(cuò)誤。

OK,準(zhǔn)備工作就緒,下面開始編譯真正意義上的靜態(tài)Qt庫:-)

編譯靜態(tài)Qt庫

既然找到了解決方法,這個(gè)編譯就應(yīng)該沒問題了吧。可是configure時(shí)明明用-static配置了Qt,編譯結(jié)果確仍然事與愿違。仔細(xì)查看所生成的 makefile,才發(fā)現(xiàn)編譯選項(xiàng)都是/MD、/MDd。問題就出在這里啦,不過這成千上百個(gè)makefile,難道要手動(dòng)一個(gè)個(gè)修改……一定有什么東西決定了makefile的生成參數(shù)。不錯(cuò)!就在Qt根目錄中的mkspecs目錄里,一看名字就知道是make specification的縮寫。該目錄下,各種平臺(tái)下的各個(gè)編譯器都有一個(gè)子目錄。嘿嘿,編譯器的編譯選項(xiàng)就都在這里了,打開win32- msvc2008中的qmake.conf看看,找到了下面兩行嗎:

  1. [cc lang="make"]  
  2. QMAKE_CFLAGS_RELEASE = -O2 -MD -GL  
  3. QMAKE_CFLAGS_DEBUG = -Zi -MDd  
  4. [/cc] 

相信你已經(jīng)知道了問題答案,將它們改成:

  1. [cc lang="make"]  
  2. QMAKE_CFLAGS_RELEASE = -O2 -MT -GL  
  3. QMAKE_CFLAGS_DEBUG = -Zi -MTd  
  4. [/cc] 

同時(shí)別忘了加入前面提到的忽略庫選項(xiàng),修改QMAKE_LFLAGS_RELEASE和QMAKE_LFLAGS_DEBUG參數(shù)為:

  1. [cc lang="make"]  
  2. QMAKE_LFLAGS_RELEASE = /INCREMENTAL:NO /LTCG /NODEFAULTLIB:libc.lib /NODEFAULTLIB:msvcrt.lib/NODEFAULTLIB:libcd.lib 
  3. /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib  
  4. QMAKE_LFLAGS_DEBUG = /DEBUG /NODEFAULTLIB:libc.lib /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib 
  5. /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:msvcrtd.lib  
  6. [/cc] 

大功告成,這個(gè)時(shí)候再在Qt的根目錄下configure -static …(其它選項(xiàng)自行選擇),然后nmake,兩三個(gè)小時(shí)之后,真正意義上的靜態(tài)Qt庫就產(chǎn)生了。本人有個(gè)小建議,其實(shí)編譯demos和examples 會(huì)消耗非常多時(shí)間,你只用cd src然后nmake來編譯Qt庫,如有需要cd tools來編譯諸如QtDesigner之類的工具。

另外webkit庫的編譯是最耗時(shí)的,如果你不準(zhǔn)備使用這個(gè)庫,那么configure加入 -no-webkit,這樣,整個(gè)編譯過程大概值耗時(shí)40-60分鐘。這時(shí)候你可以嘗試建立***個(gè)純靜態(tài)的Qt程序,不過當(dāng)你鏈接的時(shí)候,仍然會(huì)出現(xiàn)一大堆鏈接錯(cuò)誤,提示 unresolved external symbol。這個(gè)時(shí)候你只需要在你的Qt工程文件.pro里面加入:

  1. [cc lang="make"]  
  2. win32:LIBS += Imm32.lib Winmm.lib ws2_32.lib  
  3. [/cc] 

即可。至此,你的”純”靜態(tài)Qt應(yīng)用程序就可以發(fā)布給用戶啦。

小結(jié):詳解編譯Windows平臺(tái)下靜態(tài)Qt庫的內(nèi)容介紹完了,希望通過本文的學(xué)習(xí)能對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來源: 嘻來嚷往
相關(guān)推薦

2011-06-21 17:35:11

Qt Creator 編譯

2011-07-05 10:44:51

Qt Sqlite 靜態(tài)編譯

2011-06-21 16:40:58

Qt 靜態(tài)編譯

2011-06-23 09:54:00

VS2010 Qt 4.7.2 Qt

2011-06-21 16:51:21

Qt 靜態(tài) 編譯

2011-09-06 16:00:08

QT平臺(tái)靜態(tài)庫

2011-06-29 17:00:26

QT 靜態(tài)編譯 Debug

2011-06-29 09:33:18

Qt 編譯

2011-06-23 10:16:55

VS2010 QT 4.7.2 QT

2011-06-21 17:01:44

Qt 靜態(tài) 編譯

2011-09-26 10:46:32

Android云計(jì)算開發(fā)

2011-07-05 10:03:00

Qt MYSQL 數(shù)據(jù)庫

2011-06-09 11:11:35

QT 靜態(tài)庫 動(dòng)態(tài)庫

2017-08-09 16:27:59

LinuxWMware虛擬機(jī)

2010-02-25 15:30:47

SDRAMWindows CE

2011-04-02 11:11:44

windows安裝MRTG

2012-07-06 15:10:39

跨平臺(tái)工具QtNokia

2011-06-23 14:27:48

QT QLibrary 動(dòng)態(tài)庫

2011-08-17 11:28:54

Objective-C模擬開發(fā)Windows平臺(tái)

2009-04-27 16:04:47

Windows 7微軟操作系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)