qmake 语法

Qt 的 qmake 语法中 $$、反斜杠 \ 的核心功能,以及 LIBS 变量的具体用法,

一、$$ 的核心功能:变量引用运算符

$$ 是 qmake 中获取已定义变量值的核心运算符,作用是"取出变量里存储的内容",相当于把变量"替换"成它的实际值。

1. 基础用法(结合你的代码)

你定义了 OPENCV_PATH = D:/environment/opencv,后续用 $$OPENCV_PATH 就是引用这个变量的实际路径:

pro 复制代码
# 定义变量
OPENCV_PATH = D:/environment/opencv
# 引用变量:$$OPENCV_PATH 会被替换成 D:/environment/opencv
INCLUDEPATH += $$OPENCV_PATH/build/include

最终 qmake 解析后,这行代码等价于:

pro 复制代码
INCLUDEPATH += D:/environment/opencv/build/include
2. 适用场景
  • 自定义变量引用 :像你定义的 OPENCV_PATHGSTREAMER_PATH 这类自己创建的变量,必须用 $$ 引用;
  • 内置变量引用 :qmake 自带的内置变量(如 $$OUT_PWD 表示程序输出目录、$$PWD 表示当前 .pro 文件所在目录),也需要用 $$ 取值;
  • 嵌套引用 :支持变量嵌套(比如 A = $$BB = test,则 $$A 最终是 test)。
3. 易错点
  • 引用变量时必须加 $$ ,直接写 OPENCV_PATH 会被 qmake 当作字符串,而非变量值;
  • 变量名区分大小写(比如 $$OpenCV_Path$$OPENCV_PATH 是两个不同变量)。

二、反斜杠 \ 的功能:行连接符

反斜杠 \ 在 qmake 中是行连接符,作用是"告诉 qmake:当前行的语句还没结束,下一行是同一语句的延续",主要用于拆分过长的代码行,提升可读性。

1. 基础用法(结合你的代码)

你的 INCLUDEPATH 配置拆分成多行,靠 \ 连接:

pro 复制代码
INCLUDEPATH += $$OPENCV_PATH/build/include \
               $$OPENCV_PATH/build/include/opencv2

去掉 \ 后写成一行也可以,但可读性差:

pro 复制代码
# 等价写法(无反斜杠),但过长不推荐
INCLUDEPATH += $$OPENCV_PATH/build/include $$OPENCV_PATH/build/include/opencv2
2. 关键注意事项
  • \ 后面不能有任何空格/制表符 :如果 \ 后加了空格,qmake 会解析失败(比如 \ 带空格);
  • 仅用于"一行拆多行":只有当一条语句需要跨多行时才用,单行语句无需加 \
  • 最后一行无需加 \:比如你 INCLUDEPATH 的第二行末尾没有 \,因为语句已结束。

三、LIBS 的用法:指定链接库(路径+库名)

LIBS 是 qmake 中配置编译时链接的库文件的核心变量,作用是告诉编译器:"去哪里找库文件,以及要链接哪些库"。

1. 核心语法规则

LIBS 的基本格式是:

pro 复制代码
LIBS += -L<库文件路径>  # 指定库文件所在目录(-L 是路径前缀)
LIBS += -l<库名>        # 指定要链接的库名(-l 是库名前缀)

也可以合并写:

pro 复制代码
LIBS += -L<路径> -l<库名1> -l<库名2>
2. 结合你的代码拆解
OpenCV 的 LIBS 配置
pro 复制代码
LIBS += -L$$OPENCV_PATH/build/x64/vc15/lib \
        -lopencv_world3420
  • -L$$OPENCV_PATH/build/x64/vc15/lib
    -L 表示"指定库路径",后面跟着 OpenCV 库文件(.lib)所在的目录,$$OPENCV_PATH 替换后最终是 D:/environment/opencv/build/x64/vc15/lib
  • -lopencv_world3420
    -l 表示"链接这个库",qmake 会自动匹配对应平台的库文件:
    • Windows 下:-lopencv_world3420 等价于链接 opencv_world3420.lib(去掉 lib 前缀?不,Windows 下是去掉 .lib 后缀,直接用库名);
    • Linux 下:-lopencv_core 等价于链接 libopencv_core.so(自动加 lib 前缀和 .so 后缀)。
3. 补充说明(Windows/Linux 差异)
平台 库文件类型 -l 后的库名规则 示例
Windows .lib 直接用库名(去掉 .lib 后缀) opencv_world3420.lib-lopencv_world3420
Linux .so 去掉 lib 前缀和 .so 后缀 libgstreamer-1.0.so-lgstreamer-1.0
4. 易错点
  • -L-l 是小写字母,不能写成大写(-L-l-l-I);
  • 库路径必须是绝对路径 (或基于 $$PWD 的相对路径),否则编译器找不到库;
  • 链接多个库时,库的顺序可能影响链接结果(依赖的库要写在后面)。

总结

语法元素 核心功能 你的代码示例对应
$$ 引用变量的值,替换为变量存储的实际内容 $$OPENCV_PATH 替换为 D:/environment/opencv
\ 行连接符,拆分长语句为多行,提升可读性 INCLUDEPATH/LIBS 中跨多行的连接
LIBS 指定编译时链接的库路径(-L)和库名(-l 链接 OpenCV 的 opencv_world3420.lib、GStreamer 的 gstreamer-1.0.lib

关键点回顾

  1. $$ 是"变量取值符",所有自定义/内置变量都需要用 $$ 才能拿到值;
  2. \ 是"行连接符",仅用于拆分长语句,且 \ 后不能有空格;
  3. LIBS 核心是 -L(指定库路径)+ -l(指定库名),Windows/Linux 库名规则略有差异,但 -L/-l 用法统一。
相关推荐
机器视觉知识推荐、就业指导26 分钟前
Qt 小技巧:如何用 Q_PROPERTY 管理属性
服务器·数据库·qt
hqwest1 小时前
码上通QT实战11--监控页面03-绘制湿度盘和亮度盘
开发语言·qt·绘图·自定义组件·部件·qpainter·温度盘
起个名字费劲死了1 小时前
QT + Socket 客户端/服务端 公网通讯
服务器·c++·qt·socket
羊小猪~~5 小时前
【QT】-- QT基础类
开发语言·c++·后端·stm32·单片机·qt
起个名字费劲死了6 小时前
QT 学习:协同开发的程序如何汇总到主程序
qt
资深流水灯工程师8 小时前
基于Python的Qt开发之Pyside6 QtSerialPort库的使用
python·qt
一只小bit8 小时前
Qt 对话框全方面详解,包含示例与解析
前端·c++·qt·cpp·页面
SunkingYang9 小时前
QT中QStringList如何查找指定字符串,有哪些方式?
qt·字符串·查找·子串·qstringlist
牵牛老人9 小时前
Qt后端开发遇到跨域问题终极解决方案 与 Nginx反向代理全解析
qt·nginx·状态模式
hqwest9 小时前
码上通QT实战32--报警页面02-触发报警条件
开发语言·qt·传感器采集·温度报警·湿度报警·亮度报警·阈值判定