VS2013+qt-vs-addin-1.2.4安裝配置


--------------------------開頭這部分可以跳過,僅作為筆記-----------------------

我問過的問題:

http://www.codeproject.com/Questions/1052584/Visual-Studio-compiling-Qt-code-report-LNK

http://www.qtcentre.org/threads/64257-Visual-Studio-compiling-Qt-code-report-LNK2019

另一個論壇我問的問題:

Q:
用Qt的QString應該鏈接到哪個lib?
現在需要用Qt的QString, IDE用的VS.
翻了半天文檔也沒發現該鏈接到哪個lib啊, 總沒必要把100多個lib全給加到項目依賴里面去吧...

A:
看那個提示應該不是lib找不到吧?lib找不到的話會直接抱錯無法找到.lib的吧

A:
你確定報LNK2019的函數都在Qt5Cored.lib中?

Q:
請教一個問題
如果VS報錯LNK2019的符號是: "__declspec(dllimport) public: __thiscall QString::QString(void)" (__imp_??0QString@@QAE@XZ)
我用 dumpbin /exports /out:qt5cored.exports qt5cored.lib 查看了一下導出的符號, 相關的符號是
??0QString@@QEAA@XZ (public: __cdecl QString::QString(void))
__cdecl 和 __thiscall 的區別是不是導致LNK2019的原因????

A:
調用約定不同,符號名也不同。
靜態鏈接和動態鏈接,符號名也不同。
動態鏈接時沒寫 __declspec(dllimport),一般情況下沒事。應該靜態鏈接但是寫了 __declspec(dllimport),那就不行了。

Q:
dllimport 肯定是 Qt頭文件自己加上去的 莫非是因為我沒有定義相關的宏所以沒有正確地告訴Qt我要靜態鏈接, 再找找

 

-----------------------------------------------------------------------------------

 

VS安裝略過.

 

去Qt官網下載在線安裝包, 我下載的是qt-unified-windows-x86-2.0.2-2-online.exe

這貨會檢測你系統上的編譯器並下載對應的lib文件, 我的是 MSVC 12.0

 

打開后我一路默認安裝到D:\Qt

(它默認居然既勾選了5.4也勾選了5.5)

 

安裝完成后目錄結構如下:

 

 

最開始我嘗試不安裝qt-vs-addin就直接用VS導入Qt的lib文件用, 簡單用QString和QDir寫了個測試(創建+刪除文件夾, 代碼很簡單, 就幾行, 略), 結果報錯, 如下圖

 

注意我這里用的是Qt5.5的lib和頭文件.

 

結果我在壇子上問了幾個問題, 別人叫我打開linker的/VERBOSE選項看看到底問題出在哪里

 

一看, Qt5Cored.lib和qtmaind.lib都標記為"未使用"

 

我就奇怪了, 就仔細看LNK2019的信息, 隨便找了一個

1>main.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: __thiscall QString::QString(void)" (__imp_??0QString@@QAE@XZ),該符號在函數 _main 中被引用

 

好的, 我就dumpbin /exports /out:qt5cored.exports qt5cored.lib 查看了一下導出的符號, 相關的符號是
??0QString@@QEAA@XZ (public: __cdecl QString::QString(void))
首先, lib中的是 __cdecl, MSVC要查找的是 __thiscall , 調用約定不同.

另外, 符號也不同, 注意一個是 ??0QString@@QAE@XZ, 而 lib中的是 ??0QString@@QEAA@XZ

還有就是 MSVC 查找的是 __declspec(dllimport) 也就是說定義在DLL中的函數, 但是我在項目配置中只配置了lib文件(而且不是dll的import lib)

 

我就想 dllimport 肯定是 Qt頭文件自己加上去的 莫非是因為我沒有定義相關的宏所以沒有正確地告訴Qt我要靜態鏈接, 於是我就用VS查看QString的定義, 找到了一個Q_CORE_EXPORT宏, 再查看定義, 它由QT_SHARED和QT_STATIC控制, 然后我就再找不到相關的線索了, 可能在別的頭文件里. 我就嘗試定義QT_STATIC, 結果還是報LNK2019. 沒卵用.

 

我在VS里的配置肯定少了什么, 光導入lib可能是不夠的. 比如說相關的宏定義, 這樣才能正確地編譯鏈接Qt的代碼(畢竟編譯器, 系統, 版本, 鏈接方式什么的都需要通過宏定義說清楚.)

 

實在沒轍, 我就下載了qt-vs-addin, 我下載的是:qt-vs-addin-1.2.4-opensource.exe

 

關掉VS. 一路默認安裝. 安裝好之后 VS 工具欄上出現了 Qt5 的按鈕. 可以新建 Qt5 的工程了.

 

新建了一個. 看addin是怎么配置的.

 

1. Qt5->Qt Options->版本, 我先選的5.5. 其他東西都默認.

 

2. 查看VC項目配置, 首先是目錄配置, Qt Addin沒有選擇全局配置, 而是在編譯器和鏈接器選項中單獨配置頭文件, 庫文件路徑

 

3. 注意 Addin 添加了幾個宏定義, 這個是成功編譯鏈接的關鍵

我猜定義UNICODE, WIN32, WIN64是Qt在Windows平台上匹配MSVC必須的宏, 畢竟QString是UNICODE的, 其他也得按MSVC的規則編譯.

另外, QT_DLL應該是指定了Qt庫不是靜態鏈接而是動態鏈接.

QT_CORE_LIB也指定了要用的庫是Qt5Core.

 

4. 如果以前構建過項目, 一定要清理, 清理!!!!! 然后重新構建. 就可以了.

 

從上面可以看出, 為了讓Qt在VS中能成功生成二進制代碼. 你手動去添加路徑, 宏, 很麻煩的, 比如你如果不止用了QtCore呢? 還要定義哪些宏? 這個只有QtAddin知道了. 你可以試試右擊Qt項目->Qt Project Settings->Qt Modules->添加Xml, 然后你再去看看VS項目屬性中發生了哪些變化. 很多的, 你手動弄很容易出錯. 交給QtAddin解決吧.

 

----------------------------------------

 

可以看出上面的很多路徑配置依賴於$(QTDIR)的定義, $(QTDIR)舉個例子其實就是我們上面說到的D:\Qt\5.5\msvc2013_64

有時候你發現找不到Qt的頭文件, 或者linker報錯LNK2019等等, 你就應該打開VC項目屬性, 查看編譯器的命令行, 看QTDIR有沒有正確定義.

或者查看鏈接器的命令行(或者打開/VERBOSE)看QTDIR有沒有正確定義. 如果沒有, 按照下述步驟重新定義QTDIR:

1.

每次修改$(QTDIR)應該首先關閉所有的Qt項目, 重新打開Qt項目才會生效

2.

然后點Qt5->Qt Options->Delete所有已添加項->Add->選擇比如我們上面說到的D:\Qt\5.5\msvc2013_64, 命名為Qt5.5->確定->Default Qt/Win version選擇剛剛設置的Qt5.5->點OK

3.

重新打開Qt項目, 就生效了

 

還有另一種情況你發現linker報LNK2019, 你選擇項目->項目屬性->配置屬性->常規->平台->注意看是Win32還是x64, 這個一定要跟Qt的匹配!

我就是因為VC項目是Win32但Qt是X64的一直報LNK2019錯誤.

選擇"配置管理器", 把"平台"修改為"X64"即可.


免責聲明!

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



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