原
2023年03月18日 16:45:00
weixin_33812433
閱讀數 69
用cmake來組織的工程中要用qt首先要設定、找到qt相關模組。主要是通過find_package
這個cmake命令。但網上很多教程都過時了,或者不夠清晰靈活。因為這部分很常用,所以特別用一篇文章把我們目前在生產環境中使用的方法給大家介紹下。
qt版本很多,我們的開發機上一般也裝有多個不同版本的qt。個人嘗試性的專案一般用最新版的qt,而真正發布的產品一般用的是lts版本qt(lts:long term support,長期支援版本,目前最新的lts是5.9)。
我們的方法是在系統中新增多個環境變數。例如我電腦上裝有4個版本:qt 5.9.4和qt5.10.1的32位和64位庫。所以有4個環境變數:
環境變數名
值qtdir594
c:\qt\qt5.9.4\5.9.4\msvc2015
qtdir594_64
c:\qt\qt5.9.4\5.9.4\msvc2015_64
qtdir5101
c:\qt\qt5.10.1\5.10.1\msvc2015
qtdir5101_64
c:\qt\qt5.10.1\5.10.1\msvc2015_64
然後在cmakelists中新增:
set(cmake_prefix_path $env)
通過在$env{}
裡選擇不同的環境變數就可以切換不同的qt版本。
網上很多cmake查詢qt方法都是過時的qt4的方法。現在正確的、最新的方法是:
find_package(qt5 components core gui qml quick required)
components
後面加的就是這個工程中會用到的qt模組,例如上面就用到了core、gui、qml、quick這幾個模組,也是一般乙個qt quick程式必須用到的幾個模組。
qt quick程式中的qrc資源檔案需要用rcc來進行預處理,生成相應.h
和.cpp
檔案。qobject
派生的c++類也需要通過moc進行處理。這些都是編譯系統中所謂的rules。cmake中通過開啟下面兩個選項可以自動對這些字尾的檔案進行相應處理:
set(cmake_automoc on)
set(cmake_autorcc on)
由於生成的c++檔案都是放在編譯目錄裡的(在shadow building中有別於原始碼目錄),所以還需要將編譯目錄包含到include目錄,否則編譯器會找不到這些標頭檔案:
set(cmake_include_current_dir on)
target_link_libraries($ qt5::core qt5::gui qt5::qml qt5::quick)
這樣就能鏈結上用到的qt庫了。
上面只是著重說明了cmake關於新增qt模組的**,乙個完整的cmake例子肯定不止上面這些。下面就貼出乙個完整的例子:
cmake_policy(version 3.9)
project(demo version 0.1)
cmake_minimum_required(version 3.9)
set(cmake_cxx_standard 11)
set(cmake_include_current_dir on)
set(cmake_automoc on)
set(cmake_autorcc on)
set(cmake_prefix_path $env)
find_package(qt5 components core gui qml quick required)
set(resources
qml.qrc
)set(qmls
main.qml
)add_executable(pro
ject
name
pa
n>
ancl ass= "hlj s−va riab le "> projec tna mepa n> ancl ass= "hlj s−va riab le"> s ou rces
pa n> ancl ass= "hlj s−va riab le "> source span> ancl ass= "hlj s−va riab le"> q ml s
pa n>)t arge tlin klib rari es ( ancl ass= "hlj s−va riab le "> ) target_link_libraries( qmls pan>)t arge tli nkl ibra ries (ancl ass= "hlj s−va riab le"> qt5::core qt5::gui qt5::qml qt5::quick) 當需求複雜之後cmake中還會有很多命令,這個以後我們介紹具體技術的時候再講。 在cmake 3.12之前,新增編譯選項可以如下方式新增 add definitions wall g 新增了之後,就相當於在編譯的時候加上了 wall g選項 沒加之前 gcc c main.c o test 新增之後,相當於 gcc g wall c main.c o test書中給出的示例如下... relocation r x86 64 32 against text can not be used when a shared object recompile with fpic 分別驗證過以下二種方法 第一種 筆者所採用的,因需修改原始cmakelists.txt檔案,感覺不太方便,非常希望... 參考 cmake教程 第9講 目錄樹 沒有編譯,所以build資料夾為空 方法1 使用include directories 新增外部標頭檔案位址 使用target link libraries 鏈結共享庫 include directories usr include add executable...用cmake來組織的工程中要用qt首先要設定、找到qt相關模組。主要是通過find_package
這個cmake命令。但網上很多教程都過時了,或者不夠清晰靈活。因為這部分很常用,所以特別用一篇文章把我們目前在生產環境中使用的方法給大家介紹下。cmake中新增 g編譯選項
cmake中新增 fPIC編譯選項方法
cmake 模組的使用和自定義模組