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

说明

Qt的库、头文件比较多,离开Qt Creator或者qmake工具编译链接Qt程序,非常麻烦。

个人喜欢VSCode,所以在VSCode下手工搭建Qt的开发环境;

前置条件

环境:

Mac OS X 10.14.6

Qt版本

5.12.1

Qt的安装

是有那个官方提供的dmg文件安装;

安装的问题:

头文件与库都安装在指定的目录下,头没有拷贝到系统的/usr/include或者/usr/local/include下,库文件也没有拷贝到/usr/lib与/usr/local/lib目录下

Qt自带的工具qmake,uic等工具与没有拷贝到系统指定的PATH环境变量中。

头文件的处理

问题

Mac OS X安装Qt后的头文件有两个问题

Qt的头文件采用C++无.h风格,C.h风格,头文件的引用关系比较混乱(Qt自己管理是非常清晰的);

大量使用QtWidgets/qapplication.h,但实际安装的framework目录下,没有QWidgets目录;

其中qconfig.h文件使用风格是QtCore/qconfig.h,实际上QtCore这个目录下没有qconfig.h头文件;

解决办法

头文件目录的问题

使用安装目录下源代码目录中的头文件

头文件是编译时使用,主要用来检测类型、函数、类的定义;与链接无关,只要是正确的,使用哪个无所谓。

下面是安装目录下的源代码目录结构:

Qt5.12安装后的目录结构

在VSCode下的头文件配置

需要使用的就慢慢添加!

在VSCode下配置include

在编译命令行中头文件配置

这个太多,命令行非常长。

使用-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

QtCore目录下没有qconfig.h文件的问题解决,有两个解决方法:

从其他地方拷贝一个过去

在Src在重新编译一次(qconfig.h不是Qt的一部分,而是编译的时候动态产生的环境参数文件)【提示:不需要安装就有】

首先执行:./configure命令产生配置文件;

然后执行:make命令编译链接;【提示:Qt编译安装时间long long ago!】

最后,需要可以执行:make install命令安装;

我采用重新编译的方法。

重新编译后,在源代码目录有config.h文件

动态库的处理

问题

动态库有两个问题

动态库的路径问题,因为Mac OS采用的framework格式,所以clang编译器中使用的方式不同;

执行的时候,可能找不到动态库;

解决办法

动态库查找问题

使用-L选项参数指定动态库的路径;

对framework使用-F选项参数指定路径;

framework的指定问题

使用-framework选项参数指定;

通过上面的步骤,可以编译链接成功,但是存在一个找不到动态库的问题:

因为Qt的库安装的时候,没有拷贝到系统库目录;

运行的错误截图

库找不到问题的解决:

在编译的时候,直接指定动态库位置(可以指定当前路径相对的某个目录下)

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环境变量设置即可

在系统与用户配置文件配置profile与.bash_profile

使用export PATH=${PATH}:/Users/yangqiang/Qt512/5.12.1/clang_64/bin:.

一个例子

代码

#include

#include

#include

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安装!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐