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 用法统一。
相关推荐
Larry_Yanan8 小时前
Qt网络开发之基于 QWebEngine 实现简易内嵌浏览器
linux·开发语言·网络·c++·笔记·qt·学习
一然明月10 小时前
Qt QML 锚定(Anchors)全解析
java·数据库·qt
一只爱学习的小鱼儿11 小时前
使用QT编写粒子显示热力图效果
开发语言·qt
大树学长11 小时前
【QT开发】Redis通信相关(一)
redis·qt
笨笨马甲11 小时前
Qt 人脸识别
开发语言·qt
山上三树11 小时前
Qt QObject介绍
开发语言·qt
山上三树12 小时前
QObject、QWidget、Widget三者的关系
qt
坚定学代码12 小时前
qt c++ 局域网聊天小工具
c++·qt·个人开发
笨笨马甲13 小时前
Qt network开发
开发语言·qt
mengzhi啊1 天前
Qt Designer UI 界面 拖的两个 QLineEdit,想按 Tab 从第一个跳到第二个
qt