導航:首頁 > 源碼編譯 > qt使用icc編譯器

qt使用icc編譯器

發布時間:2023-06-14 03:06:50

❶ 使用Qt如何編寫模塊化插件式應用程序

本文介紹的是,對於插件式應用程序的講解,也很詳細,我們廢話不多說,先看內容。動態鏈接庫技術使軟體工程師們獸血沸騰,它使得應用系統(程序)可以以二進制模塊的形式靈活地組建起來。比起源碼級別的模塊化,二進制級別的模塊劃分使得各模塊更加獨立,各模塊可以分別編譯和鏈接,模塊的升級不會引起其它模塊和主程序的重新編譯,這點對於大系統的構建來說更加實用。另一方面,對於商業目的明顯的企業,各模塊可以獨立設置訪問許可權,開發成員只能訪問自己負責的模塊,其它模塊是不能也不給看到的,這樣減少了整個系統泄漏技術的風險。一、動態鏈接庫技術概況動態鏈接庫技術用得很多。事實上,整個Windows就是由一個個動態鏈接庫(DLL)構建起來的,不管是系統內核,或是系統調用的API封裝,還是通用工具(如控制面板、ActiveX插件等),都是一個個動態鏈接庫文件。動態鏈接庫並不是微軟獨有的技術,它是軟體工程發展到一定階段的必然產物。在類Unix系統中,這種二進制可執行模塊技術不叫動態鏈接庫,而被稱為共享對象或共享庫,後綴名一般為.so(即Share Object的簡寫)。為簡便,下文將統稱這種動態鏈接的技術為DLL或共享庫。其實,DLL文件跟普通的可執行文件差別不大,都是可執行文件嘛,裝載到進程空間後,都是一些機器指令(函數代碼)、內存分配(變數)等。在Windows中,這些可執行文件被稱作PE/COFF格式文件,在linux則稱為ELF文件。從CPU的角度看來,程序中的各個要素,不管是函數還是變數,它們都是一個個地址,函數是入口地址,變數是訪問地址;而C++的所謂類或對象,最後也被編譯器肢解成了一個個變數和函數代碼(這里是形象的說法,嚴謹技術解說請搜索C++對象模型)。DLL的裝載(指導入進程空間,然後執行)方式比可執行文件的裝載稍微復雜,因為它把模塊鏈接過程推遲到了運行時。在動態鏈接庫的裝載過程中,首要任務就是解決地址重定向問題。我們知道,DLL裝載到進程空間的位置(基址)是不確定的(動態裝載嘛),即使DLL內部使用的函數調用和全局變數引用,在裝載時都要重新計算其地址。Windows採用基址重定向(Rebasing)技術解決這一問題,而Linux採用地址無關代碼(PIC,通過GOT和PLT表實現)技術。這兩種技術各有優缺點。二、Qt中的動態鏈接庫編程使用C++面向對象的類編寫DLL是要注意很多細節的,主要是二進制(ABI)兼容問題。COM是一個很成功的例子,只要符合COM的規范,我們就能編寫出很好的DLL來,然而COM是微軟私生的,要想跨平台,我們還得另找它路。Qt的跨平台特性同樣令人(至少是我)獸血沸騰。如果你認為QT僅僅是一個跨平台界面庫,那就小看它了。我要說的是,它不但是一個通用的跨平台的面向對象的應用程序介面庫(包括GUI、資料庫、網路、多線程、XML、數據容器和演算法等,常用的編輯資源都有封裝,就是說,這些都可以跨平台,而不僅僅是界面),更是一種C++語言的擴展,一種編程平台和應用程序框架。信號和槽的機制簡化了對象之間的通信,比MFC的消息映射直觀多了;界面的布局管理機制使開發人員可以很輕松地編出優雅的窗體;界面語言翻譯機制也很方便實用;QObject容器管理可以看到Qt在內存管理方面的努力;擴展的foreach循環結構也向現代語言靠攏……Qt的跨平台特性很好,對於本文的主題——動態鏈接庫的支持也很好。QT對各種平台的動態鏈接庫編程技術都有包裝,QT把這種技術統一命名為共享庫(Shared Libraries)。通過使用Qt包裝過的類和宏,可以編寫跨平台的共享庫和插件——當然,這只是源代碼級別的跨平台,你不要指望用MSVC編譯出來的DLL,能集成到ARM平台的Linux程序上面——這是一個很美很美的理想哦。QT使用以下兩個宏來實現符號(函數或全局變數/對象)的導出和導入(跨平台不能用def文件了):Q_DECL_EXPORT // 必須添加到符號聲明中(共享庫項目) Q_DECL_IMPORT // 必須添加到符號聲明中(使用共享庫的客戶項目) Q_DECL_EXPORT // 必須添加到符號聲明中(共享庫項目)Q_DECL_IMPORT // 必須添加到符號聲明中(使用共享庫的客戶項目)QT使用 QLibrary 類實現共享庫的動態載入,即在運行時決定載入那個DLL程序,插件機制使用。三、QT共享庫和插件範例本節通過例子,實現一個共享庫和一個插件。在Windows平台上開發,使用VS2005編譯,QT庫版本為4.6.2。本例了將編寫以下三類項目:Bil 項目:共享庫項目,輸出Bil.dll和Bil.lib,基礎介面類庫,定義一個公共的介面IAnimal(抽象類),供客戶項目和插件項目使用;Plugin 類項目:插件類項目,現編寫BilDog和BilPanda兩插件項目,實現IAnimal的功能,供客戶項目載入和測試。兩項目輸出BilDog.dll和BilPanda.dll;Test 項目:客戶應用程序項目,輸出Test.exe,界面中可以選擇要載入的Animal插件,然後調用Animal的功能函數,完成測試;1. 編寫共享庫——Bil 項目的實現該項目定義一個抽象的 IAnimal 類作為導出介面,供客戶項目和插件項目使用。項目類型為共享庫,將生成Bil.lib和Bil.dll兩個文件,Bil.lib供Plugin項目和Test 項目引用,而Bil.dll將給Test.exe運行時動態載入。新建一個頭文件Bil.h,輸入如下代碼:view plain to clipboardprint? #ifndef BIL_H #define BIL_H #include <Qt/qglobal.h> // 定義BIL_SHARE,使用者可以不用再處理符號的導入和導出細節 #ifdef BIL_LIB # define BIL_SHARE Q_DECL_EXPORT #else # define BIL_SHARE Q_DECL_IMPORT #endif #endif // BIL_H #ifndef BIL_H #define BIL_H #include <Qt/qglobal.h> // 定義BIL_SHARE,使用者可以不用再處理符號的導入和導出細節 #ifdef BIL_LIB # define BIL_SHARE Q_DECL_EXPORT #else # define BIL_SHARE Q_DECL_IMPORT #endif #endif // BIL_H 你現在可能不知道BIL_SHARE宏有何用處。沒關系,請繼續看下面的IAnimal介面定義代碼:view plain to clipboardprint? #ifndef IANIMAL_H #define IANIMAL_H #include "Bil.h" class BIL_SHARE IAnimal { public: IAnimal(); virtual ~IAnimal(); public: virtual void Eat() = 0; virtual void Run() = 0; virtual void Sleep() = 0; }; #endif // IANIMAL_H #ifndef IANIMAL_H #define IANIMAL_H #include "Bil.h" class BIL_SHARE IAnimal { public: IAnimal(); virtual ~IAnimal(); public: virtual void Eat() = 0; virtual void Run() = 0; virtual void Sleep() = 0; }; #endif 現在知道BIL_SHARE宏的妙用了吧。BIL_SHARE宏會根據項目編譯選項BIL_LIB有沒有定義,自動聲明IAnimal是導出類,還是導入類。所以,使用BIL_SHARE宏,我們只需要向IAnimal插件的開發者提供同一份IAnimal定義文件(IAnimal.h)即可。當然,我們得先在Bil項目的編譯選項中定義BIL_LIB宏,使得在Bil項目內,BIL_SHARE就是導出符號的聲明。插件項目就不要定義BIL_LIB了,因為在Animal插件項目中,IAnimal是導入符號。編譯選項如何定義宏?如果使用Visual Studio工程文件,依次展開:項目屬性->配置屬性->C/C++->預處理器,在預處理器定義中添加宏BIL_LIB即可;如果是QT工程文件,請在QT工程文件Bil.pro中加入如下定義:DEFINES += BIL_LIB DEFINES += BIL_LIB 在IAnimal介面中,我們定義了三個純虛函數Eat()、Run()和Sleep(),表示吃、跑和睡眠的動作,這是抽象的,因為不同的動物有不同的吃相和睡眠姿態,而世間的動物何止千千萬——無所謂,讓這些具體動物的不同表現交給IAnimal插件的編寫者發揮吧——這就是介面的魅力,加上插件的思想,整個應用程序就變成開放的,可擴展的了!繼續編寫Anima類的實現文件Anima.cpp:view plain to clipboardprint? #include "IAnimal.h" IAnimal::IAnimal() { } IAnimal::~IAnimal() { } #include "IAnimal.h" IAnimal::IAnimal() { } IAnimal::~IAnimal() { } 雖然只實現了構造和析構函數,並且什麼工作也不做,但這是必要的,我們暫時不要使用內聯的構造和析構函數,否則在插件項目實現IAnimal時可能會出現鏈接錯誤。好了,我們開始編譯吧,生成整個Bil項目。最終我們得到兩個輸出文件:Bil.lib 和 Bil.dll。我們向Animal插件開發者提供:兩個頭文件:Bil.h 和 IAnimal.h兩個庫文件:Bil.lib 和 Bil.dll下面的插件類項目和客戶項目就是依賴這些文件實現的,也許你更願意把Bil看作是一個通用的DLL類庫,就像QT或MFC一樣——事實上也是如此,Bil就是這樣一個動態的共享類庫。2. 編寫Animal插件——BilDog和BilPanda項目的實現現在,讓我們來實現兩個小插件。BilDog插件很簡單,只是匯報下「我是Dog,我正在啃骨頭」;BilPanda也是如此——這里僅僅是測試而已,實現的項目中,你可以盡情的發揮——沒錯,是在遵循IAnimal介面的前提下。創建BilDog項目,把Bil項目輸出的Bil.h、IAnimal.h和Bil.lib加入到工程。創建Dog類的頭文件Dog.h: view plain to clipboardprint? #ifndef CLASS_DOG_H #define CLASS_DOG_H #include "IAnimal.h" class Dog : public IAnimal { public: Dog(void); virtual ~Dog(void); public: virtual void Eat(); virtual void Run(); virtual void Sleep(); }; #endif // CLASS_DOG_H #ifndef CLASS_DOG_H #define CLASS_DOG_H #include "IAnimal.h" class Dog : public IAnimal { public: Dog(void); virtual ~Dog(void); public: virtual void Eat(); virtual void Run(); virtual void Sleep(); }; #endif 創建Dog類的實現文件Dog.cpp:view plain to clipboardprint? #include <QtGui/QMessageBox> #include "Dog.h" Dog::Dog(void) { } Dog::~Dog(void) { } void Dog::Eat() { QMessageBox::information(NULL, "Hello", "Dog eating ..."); } void Dog::Run() { QMessageBox::information(NULL, "Hello", "Dog running ..."); } void Dog::Sleep() { QMessageBox::information(NULL, "Hello", "Dog sleeping ..."); } #include <QtGui/QMessageBox> #include "Dog.h" Dog::Dog(void) { } Dog::~Dog(void) { } void Dog::Eat() { QMessageBox::information(NULL, "Hello", "Dog eating ..."); } void Dog::Run() { QMessageBox::information(NULL, "Hello", "Dog running ..."); } void Dog::Sleep() { QMessageBox::information(NULL, "Hello", "Dog sleeping ..."); } 調用QT的QMessageBox::information()函數彈出一個信息提示框。還有一個非常重要的工作,我們得提供一個能夠創建(釋放)Animal具體對象(這里是Dog)的介面,並且把這些函數導出,讓主程序(Test.exe)能夠解析這個介面函數,動態創建Animal對象,並訪問其功能。新建BilDog.h文件,輸入下面的代碼:view plain to clipboardprint? #ifndef BILDOG_H #define BILDOG_H #include "Dog.h" // extern "C" 生成的導出符號沒有任何修飾,方便主程序找到它 extern "C" { Q_DECL_EXPORT IAnimal * CreateAnimal(); Q_DECL_EXPORT void ReleaseAnimal(IAnimal * animal); } #endif // BILDOG_H #ifndef BILDOG_H #define BILDOG_H #include "Dog.h" // extern "C" 生成的導出符號沒有任何修飾,方便主程序找到它 extern "C" { Q_DECL_EXPORT IAnimal * CreateAnimal(); Q_DECL_EXPORT void ReleaseAnimal(IAnimal * animal); } #endif 這兩個函數的工作很簡單,直接創建和釋放對象即可。

❷ 關於QT編譯報錯的問題,哪位大神遇到過類似的問題么,卡了我兩天了。

這個是你構建套件的問題。kit: Desktop Qt 5.6.0 MSVC2013 32bit 這句話的意思,就是你現在構建套件不匹配。
1、代碼是從別人那裡復制過來的話,記得都清楚build的路徑,qmake後,重新構建。
2、如果是IDE不對的話,得完全刪除當前的QT,然後重新下載相對應的ide。一般後面會標示。這個qt是帶編譯器的。

❸ qt是c++編譯器自帶的,還是需要自己去下載

Qt不過是使用C++的圖形庫,編譯器可以選用任何支持C++的編譯器,所以需要分別下載和安裝。
windows版的qt,大體分為兩種提供二進制下載,g++和MSVC,無論哪一種在使用前必須先安裝編譯器。另外windows版的集成開發環境Qt-creator gcc版安裝包中帶有編譯器。
在無二進制發布的操作系統,如IBM Aix中就只能使用xlc或gcc編譯器編譯qt源代碼獲得qt庫了。

❹ linux命令行編譯qt程序時,默認使用的是arm-linux-gcc編譯器,生成的可執行程序無法

修改$QTDIR/mkspecs目錄下的符號鏈接default.將其指向linux-g++
$QTDIR是路徑,具體要看你把QT裝到什麼地方和QT本身的版本,一般是/usr/lib[64]/qt4
修改default符號鏈接的作用是讓qmake在生成Makefile的時候將Makefile文件中的編譯器變數$CC與$CXX賦值成gcc和g++

❺ QT 和VC++ 的區別(包括效率)

簡單說說我的看法!
####################################################
確切說應該比較的是QT和MFC兩個界面庫
QT使用的編譯器是MinGW,即Linux下的GCC移植到windows的版本
MFC使用的編譯器是Visual C++

QT的應用主要在Linux下,但是它本身是跨平台的,也支持其他操作系統,是現在比較著名的界面庫,著名的KDE就是使用QT開發的

MFC是提供給VC的,但是它主要是代碼庫,不像VCL和編譯器掛鉤很多,但是MFC主要是對windows API的封裝,所以只能用於windows平台

根據你所說的方面,簡單比較一下:
1.開發速度
整體來說可能MFC會快捷一些,因為windows平台的開發工具大多很智能,因為立足於windows的開發人群很廣,從菜鳥到專業人士,但是QT由於基於Linux,可用的開發工具不多,大都比較專業,多是第三方產品,而且集成度不大,第三方庫也沒有MFC的多,從這一點MFC略勝一籌,但是QT自從被Nokia收購後,官方發布了跨平台集成開發環境QTCreator,所以之後走向就不好說了,個人總體感覺QT Creator和VS.net差距比較大,還需改進

但是從庫本身來說QT集成的功能較MFC龐大,而且使用的封裝技術信號和槽也是比較受到贊許的,比如QT Script為QT提供嵌入式腳本,QT界面庫支持CSS,所以QT做出來的界面比MFC要好,而且比較容易,MFC就需要藉助第三方庫了
因為MFC是淺層封裝(最新的2008 sp1加入了BCG的高級界面庫,可能有所改善)windows SDK,以降低使用windows SDK引起的開發效率的降低,和開發難度的增加
所以QT庫是比MFC優秀的,兩個庫都經受了時間的考驗,穩定性都很高,Bug幾乎沒有

2.運行效率
MFC由於其淺層封裝的特點,所以運行效率是比較高的,加上vc對windows的針對性優化,整體性能是比較高的,但是如果加入第三方庫就不敢保證了

QT因為庫比較龐大,封裝層次較深,所以運行效率較MFC為低,但是在現在的機器配置下,C#大家都不介意了,這些會引起人們的介意嗎?

3.應用范圍,現在windows的普及范圍誰能比過,所以MFC的客戶量比較多,QT主要是Linux下的開發人員在使用,但MFC也只是得益於windows(感覺又是一次捆綁戰略)

MFC不支持嵌入式開發(主要指手機平台),但是QT有對應的模塊,但是現在Java的天下又有誰能撼動?

4.學習難度
QT的封裝哲學比較明晰,和系統隔離的比較好,所以個人感覺門檻不高
MFC較難精通,因為深入開發之後SDK還是要了解的,否則程序感覺比較兒童化,呵呵

如果你要選擇工作的方向,就現在來說基於vc的開發是比較多的,所以就業比較好
Linux下的QT開發的就業情況還有待提高,但是專業方面,比如企業級的開發,或者涉及了Linux系統,QT還是可以的

這是我的一點見解,主要是自己的感覺,希望對你有所幫助!

❻ qt 只能寫c++程序嗎,不能寫c語言的程序嗎,要寫c只能用 gtk嗎

1、是可以的吧。c的文件,照樣編譯通過,使用正常參見網上:於是,為了達到最好的開發效果,開始想辦法用QtCreator來寫C/C++程序,他不僅有完善的IDE,方便的智能完成,還內嵌了gdb,調試起來很方便,感覺就和VS2005無異,更方便的是還集成了Git等版本控制插件,可以說是相當完美了。
2、其實,QtCreator是本來就是可以寫C/C++程序的,唯一的缺陷就是,它會把兩個庫鏈接進去QtCore和QtGui。這兩個是默認庫,但 是一般我們的標准C/C++程序是不用這兩個庫的。去掉也很簡單,直接用-=就可一了,用gedit或者vi建立一個空文檔,把以下內容加進去,一個標准 的Qt空C/C++項目模板就完成了,把對應位置填上項目名和文件名保存為一個.pro文件再用QtCreator打開就可以了

❼ C語言開發安裝Qt

首先qt不是一門語言,而是c++的一組類庫,當然不只是類庫。
qt-creator-opensource-windows-x86-3.5.0.exe 相當於notepad,高級一點的富文本編輯器;

qt-opensource-windows-x86-mingw492-5.5.0.exe qt + mingw那一套,也就是一鍵安裝之後同時擁有了qt,g++,gdb,qt creator就是不用做什麼配置直接用了。

qt-opensource-windows-x86-msvc2013_64-5.5.0.exe 如果你已經熟悉了vs2013,你裝了這個就可以用vs2013來開發qt項目。好像以前那個2010的版本是搞不起事的,慎裝。

qt-vs-addin-1.2.4-opensource.exe 騙你的,僅僅安裝上面那個是不夠的,你需要安裝這個並做一些配置才可以。

總的來說,ide包括以下幾個方面:
富文本編輯器(qt creator),一個類庫及其實現(qt),編譯器(g++,ms),調試器(gdb,ms)組成的,高手嘛想怎麼搭就怎麼搭。像我們這種小白,一鍵傻瓜安裝(第二個)就可以了,包治百病。

閱讀全文

與qt使用icc編譯器相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:758
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:672
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:486
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:383
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:779
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:151
伊克塞爾文檔怎麼進行加密 瀏覽:893
app轉賬是什麼 瀏覽:163