【cmake】CMake编译Qt项目

1.背景

对于Qt项目,一般情况下使用qmake进行编译,但是在编译过程中会对源代码有一定程度上的改变,而使用CMake则没有这种烦恼,或者说比较简单的进行编译。

借用网上的一句话:

CMake is CMake, others are bullshit.

2.Qt

Qt(/ˈkjuːt/,發音同「cute」)是一个跨平台的C++應用程式開發框架。廣泛用於開發GUI程式,這種情況下又被称为部件工具箱。也可用於開發非GUI程式,比如控制台工具和伺服器。Qt使用於OPIE、Skype、VLC media player、Adobe Photoshop Elements、VirtualBox與Mathematica以及被Autodesk 、歐洲太空總署、夢工廠、Google、HP、KDE、盧卡斯影業、西門子公司、富豪集團, 華特迪士尼動畫製作公司、三星集團、飛利浦、Panasonic 所使用。
它是Digia公司的产品。Qt使用標準的C++和特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些巨集。通過語言綁定,其他的程式語言也可以使用Qt。
Qt是自由且開放原始碼的軟體,在GNU較寬鬆公共許可證(LGPL)條款下發布。所有版本都支援廣泛的編譯器,包括GCC的C++編譯器和Visual Studio。------Qt-wiki

3.准备工作

Qt环境配置,在这里使用Qt4版本。

sudo apt install qt4-default

4.CMakeLists.txt

# 查找相关的依赖库
find_package(Qt4 REQUIRED)
# 添加路径
include_directories($(QT_INCLUDES))

# 设置相关变量
# 自动添加当前目录至路径中
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# 自动运行moc
set(CMAKE_AUTOMOC ON)
# 自动运行uic
set(CMAKE_AUTOUIC ON)
# 自动运行rcc
set(CMAKE_AUTORCC ON)

# 生成可执行文件
add_executable(main main.cc)
# 链接库
target_link_libraries(main Qt4::QtCore Qt4::QtGui)

至此已经可以编译单文件的Qt项目了。

5.使用Qt Designer进行界面设计

编译项目的时候会使用Qt Designer进行界面设计,完了会生成一个ui文件,我们需要将这个文件进行转换成相应的头件,当CMAKE_AUTOUIC设为ON的时候会自动生成相应的ui_xxxxx.h文件,只需要在相应的c++文件中#include ui_xxxxx.h即可。

如果没有开启该选项则可以在CMakeLists.txt使用以下命令进行手动生成。

qt4_wrap_ui(OUTPUT_FILED INPUT_FILES)

6.多个文件的情况

正常情况下我们会将不同界面写在不同文件里,假设我们的项目目录结构如下

├── CMakeLists.txt
├── test.cc
├── test.h
├── test.ui             # ui文件
├── main.cc             # 主函数所在文件

按照上面的步骤会出现如下错误或者一些函数为声明的错误

collect2: error: ld return 1 exit status

出现原因是因为没有将相关的文件生成动态库,自然找不到库文件或者函数声明了,解决方法是在CMakeLists.txt中添加如下命令:

# 生成动态库
add_library(test_lib SHARED test.cc test.h)
# 链接相关依赖
target_link_libraries(test_lib Qt4::QtCore Qt4::QtGui)

# 生成可执行文件
add_executable(main main.cc)
# 链接库
target_link_libraries(main test_lib Qt4::QtCore Qt4::QtGui)