CMake編譯Qt項(xiàng)目
1.背景
對(duì)于Qt項(xiàng)目,一般情況下使用qmake進(jìn)行編譯,但是在編譯過(guò)程中會(huì)對(duì)源代碼有一定程度上的改變,而使用CMake則沒(méi)有這種煩惱,或者說(shuō)比較簡(jiǎn)單的進(jìn)行編譯。
借用網(wǎng)上的一句話:
CMake is CMake, others are bullshit.
2.Qt
Qt(/?kju?t/,發(fā)音同「cute」)是一個(gè)跨平臺(tái)的C++應(yīng)用程式開(kāi)發(fā)框架。廣泛用於開(kāi)發(fā)GUI程式,這種情況下又被稱為部件工具箱。也可用於開(kāi)發(fā)非GUI程式,比如控制臺(tái)工具和伺服器。Qt使用於OPIE、Skype、VLC media player、Adobe Photoshop Elements、VirtualBox與Mathematica以及被Autodesk 、歐洲太空總署、夢(mèng)工廠、Google、HP、KDE、盧卡斯影業(yè)、西門子公司、富豪集團(tuán), 華特迪士尼動(dòng)畫(huà)製作公司、三星集團(tuán)、飛利浦、Panasonic 所使用。
它是Digia公司的產(chǎn)品。Qt使用標(biāo)準(zhǔn)的C++和特殊的代碼生成擴(kuò)展(稱為元對(duì)象編譯器(Meta Object Compiler, moc))以及一些巨集。通過(guò)語(yǔ)言綁定,其他的程式語(yǔ)言也可以使用Qt。
Qt是自由且開(kāi)放原始碼的軟體,在GNU較寬鬆公共許可證(LGPL)條款下發(fā)布。所有版本都支援廣泛的編譯器,包括GCC的C++編譯器和Visual Studio。------Qt-wiki
3.準(zhǔn)備工作
Qt環(huán)境配置,在這里使用Qt4版本。
sudo apt install qt4-default
4.CMakeLists.txt
# 查找相關(guān)的依賴庫(kù)
find_package(Qt4 REQUIRED)
# 添加路徑
include_directories($(QT_INCLUDES))
# 設(shè)置相關(guān)變量
# 自動(dòng)添加當(dāng)前目錄至路徑中
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# 自動(dòng)運(yùn)行moc
set(CMAKE_AUTOMOC ON)
# 自動(dòng)運(yùn)行uic
set(CMAKE_AUTOUIC ON)
# 自動(dòng)運(yùn)行rcc
set(CMAKE_AUTORCC ON)
# 生成可執(zhí)行文件
add_executable(main main.cc)
# 鏈接庫(kù)
target_link_libraries(main Qt4::QtCore Qt4::QtGui)
至此已經(jīng)可以編譯單文件的Qt項(xiàng)目了。
5.使用Qt Designer進(jìn)行界面設(shè)計(jì)
編譯項(xiàng)目的時(shí)候會(huì)使用Qt Designer進(jìn)行界面設(shè)計(jì),完了會(huì)生成一個(gè)ui文件,我們需要將這個(gè)文件進(jìn)行轉(zhuǎn)換成相應(yīng)的頭件,當(dāng)CMAKE_AUTOUIC設(shè)為ON的時(shí)候會(huì)自動(dòng)生成相應(yīng)的ui_xxxxx.h文件,只需要在相應(yīng)的c++文件中#include ui_xxxxx.h即可。
如果沒(méi)有開(kāi)啟該選項(xiàng)則可以在CMakeLists.txt使用以下命令進(jìn)行手動(dòng)生成。
qt4_wrap_ui(OUTPUT_FILED INPUT_FILES)
6.多個(gè)文件的情況
正常情況下我們會(huì)將不同界面寫(xiě)在不同文件里,假設(shè)我們的項(xiàng)目目錄結(jié)構(gòu)如下
├── CMakeLists.txt
├── test.cc
├── test.h
├── test.ui # ui文件
├── main.cc # 主函數(shù)所在文件
按照上面的步驟會(huì)出現(xiàn)如下錯(cuò)誤或者一些函數(shù)為聲明的錯(cuò)誤
collect2: error: ld return 1 exit status
出現(xiàn)原因是因?yàn)闆](méi)有將相關(guān)的文件生成動(dòng)態(tài)庫(kù),自然找不到庫(kù)文件或者函數(shù)聲明了,解決方法是在CMakeLists.txt中添加如下命令:
# 生成動(dòng)態(tài)庫(kù)
add_library(test_lib SHARED test.cc test.h)
# 鏈接相關(guān)依賴
target_link_libraries(test_lib Qt4::QtCore Qt4::QtGui)
# 生成可執(zhí)行文件
add_executable(main main.cc)
# 鏈接庫(kù)
target_link_libraries(main test_lib Qt4::QtCore Qt4::QtGui)