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 用法统一。
相关推荐
明月醉窗台12 小时前
qt使用笔记六之 Qt Creator、Qt Widgets、Qt Quick 详细解析
开发语言·笔记·qt
R_.L15 小时前
【QT】常用控件(按钮类控件、显示类控件、输入类控件、多元素控件、容器类控件、布局管理器)
开发语言·qt
无小道17 小时前
Qt——常用控件
开发语言·qt
初次见面我叫泰隆17 小时前
Qt——5、Qt系统相关
开发语言·qt·客户端开发
牵牛老人19 小时前
【Qt 开发后台服务避坑指南:从库存管理系统开发出现的问题来看后台开发常见问题与解决方案】
开发语言·qt·系统架构
xmRao20 小时前
Qt+FFmpeg 实现 PCM 音频转 AAC 编码
qt·ffmpeg·pcm
xmRao20 小时前
Qt+FFmpeg 实现录音程序(pcm转wav)
qt·ffmpeg
喜欢喝果茶.20 小时前
QOverload<参数列表>::of(&函数名)信号槽
开发语言·qt
wjhx20 小时前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
踏过山河,踏过海20 小时前
【qt-查看对应的依赖的一种方法】
qt·visual studio