Visual Studio(VS)和QT的踩坑筆記


寫在前面:在家待就業了接近半年,終於忍不住去找了份工作去嘗試一個人的生活。這第一份正式工作是做機床模擬切割的軟件開發,雖然不是傳統的互聯網工作,但因為是C++開發,工作也還算對口吧。因為疫情原因自己的實習被鴿,所以這算是我第一次上班,結果剛來就被帶進了一個大項目;要求看一份進萬行的工程源碼;boss也對我期望很大(各種暗示好好工作);每天的自己就像被趕着去屠宰的鴨子一樣。哎!苦也沒辦法,青春飯就是如此。如今好不容易項目有了階段性成果,不如乘此機會記錄下一路上踩到的各種坑,不僅加深記憶,也勉勵一下未來的自己吧!如果能順便解決網友們的疑惑,那更是不勝榮幸!(上班摸魚打出來的,無圖見諒,哈哈哈_

任務目標與現有資源

  1. 現有一份開源的三維空間物體布爾操作(交並差計算)vs工程,要求將他移植到QT平台,即完成vs工程到qt工程的移植。
  2. 環境配置如下:
  • 電腦配置:2核4G內存64位win7,不能上網
  • 開發軟件:vs2012/2015,QT5.14/5.12。
  • 可選編譯器:MSVC2015·64位,mingw64位。

兼容問題:“constexpr:函數不會生成常數表達式”

問題描述:當QT調用visual studio里的msvc編譯器時,無論什么工程都會報出如此錯誤。錯誤的文件是Qobjectdefs.h,是QT的核心文件之一。
解決過程:看來是老版本的QT還有VS存在一定的兼容問題。網上能查到的錯誤是錯在Qalgorithm.h里的,還不一樣。不過網上的那個有給出官方社區里修改源碼的辦法,我去看了一下,我的Qalgorithem已經和修訂版一樣了啊,於是便想能不能在那個社群里找到Qobjectdefs的修改版呢?然而並沒有,哈哈。
解決方法:最后找boss求來了vs2015和QT5.12,一個更新一個更老,問題得到解決。要注意的是QT安裝時,要勾選相對應VS版本的msvc編譯器。

VS Kits問題:“無法找到Visual Studio 20__(v1_0)的生成工具”

問題描述:打開那個開源工程的sln文件后,爆出如上錯誤,vs無法繼續正常生成和運行的工作。
解決過程:這個很好理解,作者當初編寫程序的時候用的vs工具集和我的不一樣,改一改就是了。
解決方法:菜單欄項目—設置,或者解決方案資源管理器里右鍵項目—設置,在配置屬性—常規—常規中找到平台工具集一項,會顯示為Visual Studio 20__(v1_0)(未安裝),點擊它在下拉框里找到自己電腦里有的隨便一個就行,再點擊應用即可。

工程遷移問題:VS工程轉換為QT Creator工程

問題描述:既然是要做VS工程轉QT平台,能讓宇宙第一IDE的VS自動完成的事情何必親自動手呢?網上查到VS果然有QT的相關插件QT VS TOOLS(能聯網的可以直接在vs工具-擴展和更新里下)。讓boss下好傳給我后雙擊vs自動安裝,重啟vs后菜單欄里有了Qt VS Tools項,那么直接Create Basic.pro file生成Qt Creator工程文件,然后Convert custom builds steps to Qt/MsBuild不就能直接工作完成了——個屁。Qt Vs Tools里這些選項全他媽是黑的!
解決過程:其實也很好理解,分布過程如下:

  1. 首先,Qt VS Tools里點Qt Options,看看有沒有自動檢測到Qt版本,如果全空的話點擊Add添加,Path里選擇(QT安裝路徑)/(qt版本號)/(msvc20xx64或32)這個路徑,VS會找到里面的Qmake程序並自動填寫Options里剩下的內容。讓Vs和你的Qt真正的“聯系”起來。
  2. 其次,在新建項目里多了新建Qt項目的選項,隨便創一個空項目,會發現這個Qt項目居然沒有Qt Creator的配置文件.pro,再看看Qt VS Tools,發現它那些轉換選項都能用了。那現在真相大白了:網上說的那些用Qt VS Tools的博客不是騙人,而是因為這方法只能用來轉換VS創建的QT工程,而不能直接轉換普通的C++工程。

解決方法:修改工程的配置文件,讓VS相信這是能轉換的玩意就行。參考如是網頁,用文本編輯器打開源工程的vcxproj文件,找到PropertyGroup Label="Globals"的配置群,在里面添加標簽Keyword,內容是Qt4VSv1.0(記得標簽閉合),保存后重新打開VS工程,就可以進行上面的操作啦。實際操作中KeyWord里時QT4還是5,VSv1.0還是2.0沒多大關系,VS會自動幫你修正的(比如我的就變成了QTVS_v303)。

庫配置問題:第三方庫的編譯和添加

問題描述:在研究的這份代碼工程里,包含了一個用於大數據計算的第三方庫Mpir,源自於Linux環境下開發的同門師兄GMP庫。Mpir下載來的源碼是sln工程,用VS編譯后便能直接使用了。但是隨着工程都移植到QT后這也出現了問題:因為VS編譯采用的是MSVC,生成的靜態庫是.lib文件;QT要用的編譯器是MINGW,采用的庫文件格式是libxxx.a,二者不一樣,所以需要重新編譯並手動添加。
解決過程:Mpir的源碼工程有點獨特,它根據目標處理器的不同分了好幾個子工程,子工程文件夾里只有sln和工程配置文件,所有工程需要的代碼文件統一保存在一起,以至於更換編譯器編譯存在一定的困難。更適合的解決方法是改用linux開發的GMP庫,並使用MINGW編譯。要注意位數要和原工程統一,不然會調用函數失敗。
解決方法對於linux開發的第三方庫,一般只需要執行如下命令:

./configure
make
make install

編譯生成庫文件后,放入工程目錄,打開pro文件開始編輯:

LIBS += -L$$PWD/(庫文件夾名) -l(庫名1) -l(庫名2)……
INCLUDEPATH+= $$PWD/庫文件夾
DEPENDPATH += $$PWD/庫文件夾

其中,$$PWD是pro文件所在目錄,-L讓QT確認庫目錄,-l確認特定的庫,第一句確定要添加的庫;第二第三句確認對應的.h和依賴路徑,這樣就足夠了。如果用QT自帶的添加庫功能的話,會報出不是win32支持的可執行文件的錯誤,所以來說還是自己編寫pro文件靠譜!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM