当前位置: 首页 > news >正文

解析pro文件

QT += core gui widgets network TARGET = ChartApp TEMPLATE = app CONFIG += c++11 CONFIG -= app_bundle DESTDIR = $$PWD/bin # 平台宏:与 Enclib 头文件(global.h / encl.h)一致 win32 { DEFINES += __MSW__ ENCLIB_ROOT = $$PWD/../Enclib_windows/Enclib } unix:!macx { DEFINES += __LINUX__ ENCLIB_ROOT = $$PWD/../Enclib_linux } INCLUDEPATH += $$ENCLIB_ROOT/include LIBS += -L$$ENCLIB_ROOT/bin -lenccore # Linux:运行时从 bin/ 旁或相对路径找到 libenccore.so unix:!macx { QMAKE_LFLAGS += -Wl,-rpath,\'\$$ORIGIN\' QMAKE_LFLAGS += -Wl,-rpath,\'\$$ORIGIN/../../Enclib_linux/bin\' QMAKE_CXXFLAGS += -Wno-unknown-pragmas } win32 { QMAKE_CXXFLAGS += -finput-charset=UTF-8 -Wno-unknown-pragmas } SOURCES += \ src/main.cpp \ src/AppStyle.cpp \ src/MainWindow.cpp \ src/ChartEngine.cpp \ src/ChartWidget.cpp \ src/ManualRoutePanel.cpp \ src/HoverInfoPanel.cpp \ src/DevicePanel.cpp \ src/CollapsibleDockPanel.cpp \ src/MsgIO.cpp \ src/TrackUdpSender.cpp \ src/DeviceUdpSender.cpp HEADERS += \ src/Target.h \ src/AppStyle.h \ src/MainWindow.h \ src/ChartEngine.h \ src/ChartWidget.h \ src/ManualRoutePanel.h \ src/HoverInfoPanel.h \ src/DevicePanel.h \ src/CollapsibleDockPanel.h \ src/MsgIO.h \ src/TrackPacket.h \ src/TrackUdpSender.h \ src/DeviceCmdPacket.h \ src/DeviceUdpSender.h # 构建后拷贝 Enclib 运行库与样式 win32 { QMAKE_POST_LINK += $$escape_expand(\\n\\t) cmd /c \"if not exist $$shell_path($$DESTDIR) mkdir $$shell_path($$DESTDIR)\" QMAKE_POST_LINK += $$escape_expand(\\n\\t) cmd /c \"xcopy /Y /D $$shell_path($$ENCLIB_ROOT/bin)\\*.dll $$shell_path($$DESTDIR)\\ >nul\" QMAKE_POST_LINK += $$escape_expand(\\n\\t) cmd /c \"if not exist $$shell_path($$DESTDIR/styles) mkdir $$shell_path($$DESTDIR/styles)\" QMAKE_POST_LINK += $$escape_expand(\\n\\t) cmd /c \"xcopy /Y /D $$shell_path($$PWD/styles)\\app.css $$shell_path($$DESTDIR/styles)\\ >nul\" } unix:!macx { QMAKE_POST_LINK += $$escape_expand(\\n\\t) mkdir -p $$DESTDIR $$DESTDIR/styles QMAKE_POST_LINK += $$escape_expand(\\n\\t) cp -f $$ENCLIB_ROOT/bin/libenccore.so $$DESTDIR/ || true QMAKE_POST_LINK += $$escape_expand(\\n\\t) cp -f $$PWD/styles/app.css $$DESTDIR/styles/ }

这是一个Qt qmake 项目文件.pro),用于构建一个名为ChartApp的图形界面应用程序。下面我按功能模块解析:

1. 基本配置

QT += core gui widgets network TARGET = ChartApp TEMPLATE = app CONFIG += c++11 CONFIG -= app_bundle
  • 启用 Qt 的coreguiwidgets(界面控件)、network(网络通信)模块。

  • 目标可执行文件名为ChartApp

  • 构建为应用程序(app),不是库。

  • 使用 C++11 标准。

  • 在 macOS 上禁用默认的.appbundle 模式(生成普通可执行文件)。

  • app_bundlemacOS 特有的配置,默认在某些情况下会启用。

2. 输出目录

DESTDIR = $$PWD/bin

所有构建产物(可执行文件、依赖库等)输出到项目根目录下的bin/文件夹。

3. 平台区分与 Enclib 依赖

win32 { DEFINES += __MSW__ ENCLIB_ROOT = $$PWD/../Enclib_windows/Enclib } unix:!macx { DEFINES += __LINUX__ ENCLIB_ROOT = $$PWD/../Enclib_linux }
  • Windows:定义宏__MSW__,使用同级目录../Enclib_windows/Enclib作为第三方库Enclib的根路径。

  • Linux:定义宏__LINUX__,使用../Enclib_linux作为Enclib 根路径

4. 包含路径与链接库

INCLUDEPATH += $$ENCLIB_ROOT/include LIBS += -L$$ENCLIB_ROOT/bin -lenccore
  • 头文件搜索路径:Enclib/include

  • 链接库:Enclib/bin下的enccore(Windows 为.dll,Linux 为.so)。

5. Linux 专属链接选项

unix:!macx { QMAKE_LFLAGS += -Wl,-rpath,\'\$$ORIGIN\' QMAKE_LFLAGS += -Wl,-rpath,\'\$$ORIGIN/../../Enclib_linux/bin\' QMAKE_CXXFLAGS += -Wno-unknown-pragmas }
  • 设置rpath,让可执行文件优先从自身所在目录($ORIGIN以及相对路径../../Enclib_linux/bin查找libenccore.so,方便部署。

  • 忽略未知的#pragma警告(通常是第三方库引入的)。

6. Windows 专属编译选项

win32 { QMAKE_CXXFLAGS += -finput-charset=UTF-8 -Wno-unknown-pragmas }
  • 指定源文件字符集为 UTF-8。

  • 同样忽略未知#pragma警告。

7. 源文件与头文件列表

列出了src/目录下的所有.cpp.h文件,包括:

  • 主程序入口main.cpp

  • 界面与样式:MainWindowAppStyle

  • 图表相关:ChartEngineChartWidget

  • 控制面板:ManualRoutePanelDevicePanelCollapsibleDockPanel

  • 信息显示:HoverInfoPanel

  • 网络通信:TrackUdpSenderDeviceUdpSenderMsgIO

  • 数据结构:TargetTrackPacketDeviceCmdPacket

8. 构建后处理(拷贝运行库与样式)

Windows

QMAKE_POST_LINK += ...
  • 创建bin/目录(若不存在)。

  • Enclib/bin/*.dll拷贝到bin/

  • 创建bin/styles目录。

  • 将项目styles/app.css拷贝到bin/styles/

Linux

unix:!macx { QMAKE_POST_LINK += ... }
  • 创建bin/bin/styles目录。

  • 拷贝libenccore.sobin/

  • 拷贝app.cssbin/styles/

总结

这是一个依赖第三方 Enclib 库的 Qt 图表应用,支持 Windows 和 Linux 跨平台编译,自动处理库拷贝和样式资源部署。项目结构清晰,分为界面、图表引擎、网络通信、数据封装等模块。


QMAKE_POST_LINK += $$escape_expand(\\n\\t) cmd /c \"if not exist $$shell_path($$DESTDIR) mkdir $$shell_path($$DESTDIR)\"

这行代码是Windows 下构建后执行的命令,用于在编译链接完成后自动创建输出目录。我来逐层拆解:

各部分含义

1.QMAKE_POST_LINK

  • Qt qmake 的内置变量,用于指定链接完成后要执行的额外命令。

  • 可以追加多个命令,用换行符分隔。


2.$$escape_expand(\n\t)

  • $$escape_expand()是 qmake 函数,将转义字符展开为实际字符。

  • \n→ 换行符

  • \t→ 制表符(缩进)

  • 作用:让生成的 Makefile 中,这行命令前有换行和缩进,使格式更整洁(不影响功能)。

3.cmd /c

  • Windows 命令解释器,/c表示执行后面的字符串命令并退出。

4."if not exist $$shell_path($$DESTDIR) mkdir $$shell_path($$DESTDIR)"

这是实际的 Windows 批处理命令:

部分含义
if not exist如果目录不存在
$$shell_path($$DESTDIR)DESTDIR(即bin/)转换为 Windows 可识别的路径格式(如C:\...\bin
mkdir创建该目录

完整执行流程

编译链接完成后,Qt 会生成类似这样的 Makefile 命令:

post_link: cmd /c "if not exist C:\MyProject\bin mkdir C:\MyProject\bin"

为什么需要这个?

  • 确保输出目录bin/在拷贝 dll 和样式文件之前存在。

  • 如果目录已存在,if not exist避免重复创建报错。


QMAKE_POST_LINK += $$escape_expand(\\n\\t) cmd /c \"xcopy /Y /D $$shell_path($$ENCLIB_ROOT/bin)\\*.dll $$shell_path($$DESTDIR)\\ >nul\"

xcopy命令详解

参数含义
xcopyWindows 的复制文件和目录树命令
/Y禁止提示确认覆盖(自动覆盖已存在的文件)
/D只复制比目标更新的文件(如果目标不存在或源文件更新,则复制)
$$shell_path($$ENCLIB_ROOT/bin)\*.dll源路径Enclib/bin/下所有.dll文件
$$shell_path($$DESTDIR)\目标路径bin/目录(末尾反斜杠表示目标是个目录)
>nul重定向输出到空设备,不显示复制过程的信息(静默执行)

mkdir -p $$DESTDIR $$DESTDIR/styles

这是核心的 Linux shell 命令:

部分含义
mkdirLinux 创建目录命令
-p自动创建父目录+不报错如果目录已存在
$$DESTDIR输出目录(即bin/
$$DESTDIR/stylesbin/下的styles子目录
空格分隔一次创建两个目录

cp -f $$ENCLIB_ROOT/bin/libenccore.so $$DESTDIR/ || true

cp -f

Linux 拷贝命令及其参数:

参数含义
cpLinux 文件拷贝命令
-f强制覆盖(如果目标文件存在且无法打开,删除再尝试)

$$ENCLIB_ROOT/bin/libenccore.so

  • 源文件:Enclib 编译生成的动态链接库

  • $$ENCLIB_ROOT在前面定义为../Enclib_linux(相对于项目根目录)

  • 实际路径类似:../Enclib_linux/bin/libenccore.so

$$DESTDIR/

  • 目标目录:输出目录bin/

  • 末尾的/表示拷贝到目录下,保持原文件名

|| true

这是shell 逻辑或操作符,关键作用是忽略错误

写法行为
cp -f ... || true如果cp成功,true不执行;如果cp失败(返回非0),true执行并返回0(成功)
cp -f ...(不加|| true如果拷贝失败,整个构建过程会被中断

QMAKE_LFLAGS += -Wl,-rpath,\'\$$ORIGIN\'

这行代码是Linux 下设置运行时库搜索路径的链接器选项。

QMAKE_LFLAGS

  • Qt qmake 变量,用于指定链接器(linker)标志

  • 这些选项会传递给链接器(Linux 下通常是ldg++)。

-Wl,

  • 告诉编译器驱动g++/clang++):后面的参数直接传递给链接器ld

  • -Wl,后面的内容用逗号分隔,链接器会接收到-rpath '$$ORIGIN'

-rpath,'$$ORIGIN'

这是传递给链接器的核心选项:

部分含义
-rpath运行时库搜索路径(runtime search path)
'$$ORIGIN'特殊变量,表示可执行文件所在的目录

ORIGIN详解

$$ORIGIN是 Linux 动态链接器ld.so支持的特殊标记

标记含义示例
$ORIGIN可执行文件所在目录/home/user/ChartApp/bin/
$ORIGIN/../lib可执行文件目录的上级 lib/home/user/ChartApp/lib/
http://www.cnnetsun.cn/news/4295473.html

相关文章:

  • 一个 关于 椒盐 的 笑话
  • 基于pandas apply的文本预处理函数设计与DataFrame应用实践
  • C++模板与泛型编程:从《C++ Primer》习题解析到工业级代码实践
  • 手把手搭建反AI电脑:本地优先与数据隐私实践
  • 网易校招研发笔试复盘:数据结构与算法考点全解析
  • 百度前端秋招笔试复盘:从JS原理到算法题型的备考指南
  • Python数据分析与建模实战:从美赛C题到完整项目工作流
  • 阿里云秋招笔试深度拆解:从基础到云原生的备考指南
  • 阿里云研发岗秋招笔试复盘:从算法到工程实战的全面解析
  • STM32 MotionGR手势识别库:从配置到移植的完整实战指南
  • select为什么只能处理1024个连接?从源码到排障彻底讲透
  • 全国地貌shp矢量数据实操指南:从加载到转换全解析
  • C++26 std::hive 性能实测:稳定句柄与缓存局部性优势
  • 2018用友前端笔试题拆解:手写EventEmitter背后的JS核心机制
  • 2016校招前端笔试题复盘:JavaScript基础与浏览器原理是核心
  • 百度核心网络研发校招笔试题解析:TCP/IP、epoll与网络底层考点
  • OpenCut:如何5分钟跑通这款免费开源视频编辑器?新手完整指南
  • 网易校招云计算网络开发笔试题:VPC/SDN/VXLAN核心考点全解析
  • Windows系统文件Windows.Internal.Shell.XamlInputViewHost.dll丢失找不到问题解决
  • 小批量梯度下降法:原理、优势与工程实践
  • 包管理工具(cnpm,yarn)
  • 前端面试必问:DNS解析原理与实战排查全指南
  • 一文讲透|盘点2026年遥遥领先的的AI论文网站
  • 接入AI 模型实现聊天流式输出
  • PowerToys FancyZones 实战指南:从初始配置到多显示器布局的完整流程
  • 前端面试必考:JavaScript闭包原理与手撕代码详解
  • 基于SpringBoot的在线招聘系统系统设计与实现源码+文档+讲解视频
  • 如何快速搭建ops-nn开发环境:Docker、CANNLab与本地部署3种方式完整实战
  • 交易类项目-flink
  • 如何快速找到高质量公开数据集:awesome-public-datasets 完整使用指南