• 【cmake】CMake编译Qt项目


    【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
    
    • 1

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    至此已经可以编译单文件的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)
    
    • 1

    6.多个文件的情况

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

    ├── CMakeLists.txt
    ├── test.cc
    ├── test.h
    ├── test.ui             # ui文件
    ├── main.cc             # 主函数所在文件
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

    collect2: error: ld return 1 exit status
    
    • 1

    出现原因是因为没有将相关的文件生成动态库,自然找不到库文件或者函数声明了,解决方法是在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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    Openstack云平台镜像制作CentOS6.7
    C语言笔试题
    JUC并发编程(5)(自定义线程池 + 共享模型之工具2)
    【算法】斐波那契数列与台风的故事
    解决dirsearch扫描工具pkg_resources模块警告问题
    好看的水滴登录页面
    实战Spring Boot集成quartz任务调度框架
    Java,controller类里面,不要用 String (或int)定义变量
    EN 16034门窗及配件—CE认证
    虹科HiveMQ MQTT Broker如何支持平板电脑实现高效远程管理?
  • 原文地址:https://blog.csdn.net/qq_43331089/article/details/127914441