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 用法统一。
相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner11 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner13 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能14 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G15 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt