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 用法统一。
相关推荐
m0_635647482 小时前
pyqt5打包报错:qt.qpa.plugin: Could not load the Qt platform plugin “windows“
开发语言·windows·python·qt·pyqt
小灰灰搞电子3 小时前
Qt 二进制数据读写详解
开发语言·qt
小新1103 小时前
Qt 中安全拼接文件路径
开发语言·qt
X.Ming 同学4 小时前
QXlsx 库在麒麟 Linux(Qt 5.15.2)下完整安装步骤(含问题排查 & 经验总结)
linux·数据库·qt
chen_2274 小时前
qt加ffmpeg制作简易录屏工具
开发语言·qt·ffmpeg
踏过山河,踏过海4 小时前
【Qt VS Tools在Visual Studio 2019中不起作用的解决方法】
qt·visual studio
ht巷子4 小时前
Qt:容器类
开发语言·c++·qt
_OP_CHEN4 小时前
【从零开始的Qt开发指南】(十三)Qt 窗口之菜单栏完全攻略:从入门到实战,打造专业级桌面应用菜单系统
开发语言·qt·前端开发·图形化界面·菜单栏·gui开发·qt窗口
小c君tt16 小时前
QT中想在QTextEdit控件中使用Qslog日志输出出现问题原因及解决方法
开发语言·qt