欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

CV01-03:VSCode 中的 Qt 配置和编译

最编程 2024-06-01 21:17:37
...

  Qt的开发也算博大精深,是一套完整的开发体系,我仅仅是想使用GUI部分,后面可能会涉及到网络与多线程部分。搭建环境是万里长征第一步,也很重要。本主题是Mac环境下的安装搭建(其他系统可能编译环境不同而略有差异)。


  • 说明
    • Qt的库、头文件比较多,离开Qt Creator或者qmake工具编译链接Qt程序,非常麻烦。
    • 个人喜欢VSCode,所以在VSCode下手工搭建Qt的开发环境;

前置条件
  1. 环境:

    • Mac OS X 10.14.6
  2. Qt版本

    • 5.12.1
  3. Qt的安装

    • 是有那个官方提供的dmg文件安装;
    • 安装的问题:
      • 头文件与库都安装在指定的目录下,头没有拷贝到系统的/usr/include或者/usr/local/include下,库文件也没有拷贝到/usr/lib/usr/local/lib目录下
      • Qt自带的工具qmake,uic等工具与没有拷贝到系统指定的PATH环境变量中。

头文件的处理

问题

  • Mac OS X安装Qt后的头文件有两个问题
    1. Qt的头文件采用C++无.h风格,C.h风格,头文件的引用关系比较混乱(Qt自己管理是非常清晰的);
      • 大量使用QtWidgets/qapplication.h,但实际安装的framework目录下,没有QWidgets目录;
    2. 其中qconfig.h文件使用风格是QtCore/qconfig.h,实际上QtCore这个目录下没有qconfig.h头文件;

解决办法

  1. 头文件目录的问题
    • 使用安装目录下源代码目录中的头文件
      • 头文件是编译时使用,主要用来检测类型、函数、类的定义;与链接无关,只要是正确的,使用哪个无所谓。
      • 下面是安装目录下的源代码目录结构:
Qt5.12安装后的目录结构
  1. 在VSCode下的头文件配置
    • 需要使用的就慢慢添加!
在VSCode下配置include
  1. 在编译命令行中头文件配置
    • 这个太多,命令行非常长。
    • 使用-I(大写的i)选项参数指定多个头文件所在目录。
    g++ -omain main.cpp  
        -std=c++11 
        -I/Users/yangqiang/Qt512/5.12.1/Src/qtbase/include 
        -I/Users/yangqiang/Qt512/5.12.1/Src/qtbase/include/QtCore 
        -I/Users/yangqiang/Qt512/5.12.1/Src/qtbase/include/GtGui 
        -I/Users/yangqiang/Qt512/5.12.1/Src/qtbase/include/QtWidgets 
        -F/Users/yangqiang/Qt512/5.12.1/clang_64/lib 
        -framework QtCore  
        -framework QtGui  
        -framework QtWidgets  
        -Wl,-rpath,/Users/yangqiang/Qt512/5.12.1/clang_64/lib
  1. QtCore目录下没有qconfig.h文件的问题解决,有两个解决方法:

    1. 从其他地方拷贝一个过去
    2. 在Src在重新编译一次(qconfig.h不是Qt的一部分,而是编译的时候动态产生的环境参数文件)【提示:不需要安装就有】
      • 首先执行:./configure命令产生配置文件;
      • 然后执行:make命令编译链接;【提示:Qt编译安装时间long long ago!】
      • 最后,需要可以执行:make install命令安装;
    • 我采用重新编译的方法。
重新编译后,在源代码目录有config.h文件

动态库的处理

问题

  • 动态库有两个问题
    1. 动态库的路径问题,因为Mac OS采用的framework格式,所以clang编译器中使用的方式不同;
    2. 执行的时候,可能找不到动态库;

解决办法

  1. 动态库查找问题

    1. 使用-L选项参数指定动态库的路径;
    2. 对framework使用-F选项参数指定路径;
  2. framework的指定问题

    1. 使用-framework选项参数指定;
  • 通过上面的步骤,可以编译链接成功,但是存在一个找不到动态库的问题:
    • 因为Qt的库安装的时候,没有拷贝到系统库目录;


      运行的错误截图
  1. 库找不到问题的解决:
    • 在编译的时候,直接指定动态库位置(可以指定当前路径相对的某个目录下)
    • clang是编译器,连接器是ld(自动调用,其中手工调用也非常麻烦,包含系统的一些目标文件关联),可以在clang调用的时候传递参数给ld
      • -Wl选项参数就是用来传递链接参数给ld的。
  • clang的-Wl参数说明
    -Wl参数是给连接器传递参数的选项
  • ld的动态库位置指定参数说明


    rpath是指运行时的动态库搜索路径
  • 最终的编译指令为:
    g++ -omain main.cpp  
    -std=c++11 
    -I/Users/yangqiang/Qt512/5.12.1/Src/qtbase/include 
    -I/Users/yangqiang/Qt512/5.12.1/Src/qtbase/include/QtCore 
    -I/Users/yangqiang/Qt512/5.12.1/Src/qtbase/include/GtGui 
    -I/Users/yangqiang/Qt512/5.12.1/Src/qtbase/include/QtWidgets 
    -F/Users/yangqiang/Qt512/5.12.1/clang_64/lib 
    -framework QtCore  
    -framework QtGui  
    -framework QtWidgets  
    -Wl,-rpath,/Users/yangqiang/Qt512/5.12.1/clang_64/lib

Qt工具环境的处理
  • 这个问题解决直接使用PATH环境变量设置即可
    1. 在系统与用户配置文件配置profile.bash_profile
    2. 使用export PATH=${PATH}:/Users/yangqiang/Qt512/5.12.1/clang_64/bin:.

一个例子

代码

#include <QApplication>
#include <QDialog>
#include <iostream>

int main(int argc, char* argv[]) {
    QApplication app(argc, argv);
    QDialog  dlg;
    dlg.setWindowTitle("Qt程序");
    dlg.setGeometry(100,100,400,300);
    dlg.show();
    return app.exec();
}

// 编译命令:g++ -omain main.cpp  -std=c++11 -I/Users/yangqiang/Qt512/5.12.1/Src/qtbase/include -I/Users/yangqiang/Qt512/5.12.1/Src/qtbase/include/QtCore -I/Users/yangqiang/Qt512/5.12.1/Src/qtbase/include/GtGui -I/Users/yangqiang/Qt512/5.12.1/Src/qtbase/include/QtWidgets -F/Users/yangqiang/Qt512/5.12.1/clang_64/lib -framework QtCore  -framework QtGui  -framework QtWidgets  -Wl,-rpath,/Users/yangqiang/Qt512/5.12.1/clang_64/lib
// 环境命令:export PATH=${PATH}:/Users/yangqiang/Qt512/5.12.1/clang_64/bin:.

编译成功,并运行的截图

附录

Qt编译过程

  • 命令:make
make依赖Makefile文件运行

安装过程

  • 注意:需要权限
    • 需要切换到root用户
  • 命令:make install
Make安装!

推荐阅读