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_PATH、GSTREAMER_PATH这类自己创建的变量,必须用$$引用; - 内置变量引用 :qmake 自带的内置变量(如
$$OUT_PWD表示程序输出目录、$$PWD表示当前.pro文件所在目录),也需要用$$取值; - 嵌套引用 :支持变量嵌套(比如
A = $$B,B = 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后缀)。
- Windows 下:
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 等 |
关键点回顾
$$是"变量取值符",所有自定义/内置变量都需要用$$才能拿到值;\是"行连接符",仅用于拆分长语句,且\后不能有空格;LIBS核心是-L(指定库路径)+-l(指定库名),Windows/Linux 库名规则略有差异,但-L/-l用法统一。