成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解編譯Windows平臺下靜態Qt庫

移動開發
如何編譯在Windows平臺下實現真正意義上的靜態Qt庫是本文要介紹的內容,在網上看到了這么一篇對大家有幫助的文章,與大家分享一下,具體內容來看本文詳解。

如何編譯在Windows平臺下實現真正意義上的靜態Qt庫是本文要介紹的內容,在網上看到了這么一篇對大家有幫助的文章,與大家分享一下。

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

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

2、編譯時的快捷化:進行過靜態鏈接編譯的人都知道,其編譯過程的時間消耗是動態鏈接的數倍倍甚至更多;

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

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

使用時的可維護性:某個庫如果發布了更新的版本,那么你只需替換這個動態庫文件,而不需要重新編譯你的整個程序。

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

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

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

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

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

Visual Studio相關編譯選項

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

1、鏈接C/C++多線程動態庫,使用這些編譯選項,軟件部署時需要VC的再發行庫,否則就會出現上述錯誤提示。

/MD:動態鏈接多線程庫(msvcrt.lib)。使用該選項時,需要用/NODEFAULTLIB選項來忽略掉libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib庫,否則會有鏈接錯誤;

/MDd:動態鏈接多線程調試庫(msvcrtd.lib)。使用該選項時,需要用/NODEFAULTLIB選項來忽略掉libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib庫,否則會有鏈接錯誤;

2、鏈接C/C++多線程靜態庫,使用這些編譯選項,軟件部署時不需要VC的再發行庫。

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

/MTd:靜態鏈接多線程調試庫(libcmtd.lib)。使用該選項時,需要用/NODEFAULTLIB選項來忽略掉libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib庫,否則會有鏈接錯誤。

OK,準備工作就緒,下面開始編譯真正意義上的靜態Qt庫:-)

編譯靜態Qt庫

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

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

相信你已經知道了問題答案,將它們改成:

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

同時別忘了加入前面提到的忽略庫選項,修改QMAKE_LFLAGS_RELEASE和QMAKE_LFLAGS_DEBUG參數為:

  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] 

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

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

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

即可。至此,你的”純”靜態Qt應用程序就可以發布給用戶啦。

小結:詳解編譯Windows平臺下靜態Qt庫的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: 嘻來嚷往
相關推薦

2011-06-21 17:35:11

Qt Creator 編譯

2011-07-05 10:44:51

Qt Sqlite 靜態編譯

2011-06-21 16:40:58

Qt 靜態編譯

2011-06-23 09:54:00

VS2010 Qt 4.7.2 Qt

2011-06-21 16:51:21

Qt 靜態 編譯

2011-09-06 16:00:08

QT平臺靜態庫

2011-06-29 17:00:26

QT 靜態編譯 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 靜態 編譯

2011-07-05 10:03:00

Qt MYSQL 數據庫

2011-09-26 10:46:32

Android云計算開發

2011-04-02 11:11:44

windows安裝MRTG

2011-06-09 11:11:35

QT 靜態庫 動態庫

2017-08-09 16:27:59

LinuxWMware虛擬機

2010-02-25 15:30:47

SDRAMWindows CE

2012-07-06 15:10:39

跨平臺工具QtNokia

2009-04-27 16:04:47

Windows 7微軟操作系統

2011-08-17 11:28:54

Objective-C模擬開發Windows平臺

2011-06-23 14:27:48

QT QLibrary 動態庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日日噜噜夜夜爽爽狠狠 | 91精品国产91久久久久福利 | 蜜臀久久 | 久草免费在线 | 人人擦人人干 | 欧美日韩视频在线第一区 | 欧美一区二区在线观看 | 免费看国产一级特黄aaaa大片 | 久久久国产精品一区 | 99在线免费观看 | 黑人巨大精品欧美一区二区免费 | 国产欧美精品一区二区三区 | 亚洲精品日韩在线观看 | 国产最新精品视频 | 国产偷自视频区视频 | 91麻豆精品国产91久久久久久 | 精品国产一二三区 | 成人在线免费观看av | 久久国产成人午夜av影院武则天 | 无吗视频| 成人欧美一区二区 | 青娱乐一区二区 | 拍拍无遮挡人做人爱视频免费观看 | 免费久久久 | 国产精品亚洲一区 | 久久国产精品免费一区二区三区 | 黑人巨大精品欧美一区二区免费 | 日韩视频免费在线 | 国产乱码精品一区二区三区中文 | 欧美在线小视频 | 九九热精品视频 | 免费久久久 | 玖玖在线免费视频 | 欧美区在线 | 国产激情一区二区三区 | 国产精品美女一区二区 | 日本久久精品 | 中文久久 | 亚洲综合在线视频 | 日韩男人天堂 | 国产成人精品一区二区三区在线 |