qmake:高级用法

qmake:高级用法一、添加新的配置特性特性(features)是*.prf文件中自定义函数和定义的集合(Qt安装目录\mkspecs\features中有很多*.prf文件)。存放特性文件的目录有很多地方,qmake在查找.prf文件时会按以下顺序检查每个目录:在QMAKEFEATURES环境变量中列出的目录中, 在QMAKEFEATURES属性变量中列出的目录中。 在位于mkspecs目录中的features目录中。 在QMAKESPEC环境变量提供的目录下的featu

大家好,又见面了,我是你们的朋友全栈君。

一、添加新的配置特性

特性(features)是 *.prf 文件中自定义函数和定义的集合(Qt安装目录\mkspecs\features 中有很多 *.prf文件)。

存放特性文件的目录有很多地方,qmake 在查找 .prf 文件时会按以下顺序检查每个目录:

  • QMAKEFEATURES 环境变量中列出的目录中,
  • QMAKEFEATURES 属性变量中列出的目录中。
  • 在位于 mkspecs 目录中的 features 目录中。
  • QMAKESPEC 环境变量提供的目录下的 features 目录中。
  • data_install/mkspecs 目录中的 features 目录中。
  • 在作为 QMAKSPEC 环境变量指定的目录的同级存在的 features 目录中。

然后在以下子目录中搜索功能文件:

  • features/unix、features/win32、features/macx,取决于使用的平台
  • features/

例如以下配置:

 CONFIG += myfeatures

添加到 CONFIG 变量后,qmake 将在完成解析项目文件后搜索上面列出的位置以查找 myfeatures.prf 文件。在 Unix 系统上将查找以下文件:

  • $QMAKEFEATURES/myfeatures.prf
  • $$QMAKEFEATURES/myfeatures.prf
  • myfeatures.prf(在项目的根目录中)。项目根由顶级 *.pro 文件确定。
  • $QMAKEPATH/mkspecs/features/unix/myfeatures.prf 、$QMAKEPATH/mkspecs/features/myfeatures.prf
  • $QMAKESPEC/features/unix/myfeatures.prf、
    $QMAKESPEC/features/myfeatures.prf
  • data_install/mkspecs/features/unix/myfeatures.prf 和 data_install/mkspecs/features/myfeatures.prf
  • $QMAKESPEC/../features/unix/myfeatures.prf、
    $QMAKESPEC/../features/myfeatures.prf

注意:*.prf 文件的名称必须为小写。

二、安装文件

在 Unix 上经常使用构建工具来安装应用程序和库,例如通过调用 make install。qmake 有一个安装集的概念。例如,可以通过以下方式描述文档文件的集合:

 documentation.path = /usr/local/program/doc
 documentation.files = docs/*
  • path成员:通知qmake文件应该安装在/usr/local/program/doc
  • files成员:指定应该复制到安装目录的文件。这里 docs 目录中的所有内容都将复制到 /usr/local/program/doc。

然后将其附加到安装列表中:

 INSTALLS += documentation

qmake 将确保将指定的文件复制到安装目录。

如果将内置安装集附加到 INSTALLS 变量并且不指定文件或额外成员,qmake 将决定需要复制的内容。当前,支持 target dlltarget 这两个内置安装集。例如:

 target.path = /usr/local/myprogram
 INSTALLS += target

在上面两行中,qmake 知道需要复制什么,并会自动处理安装过程。

三、添加自定义目标

qmake 尝试做跨平台构建工具所期望的一切。当确实需要运行特殊的平台相关命令时,可通过自定义目标实现。

例如:

 mytarget.target = .buildfile
 mytarget.commands = touch $$mytarget.target
 mytarget.depends = mytarget2

 mytarget2.commands = @echo "假装生成了mytarget2"

1、定义qmake要生成的名为 mytarget 的目标

2、mytarget 是名为 .buildfile 的 Makefile 文件,该目标由 touch 命令生成(Linux touch命令),即运行 mytarget.commands 指定的命令

3、mytarget 依赖于 mytarget2,即mytarget2生成之后才能生成mytarget,即运行 mytarget2.commands 指定的命令

4、最后一步是使用 QMAKE_EXTRA_TARGETS 变量来指示 qmake 这个对象是要构建的目标:

 QMAKE_EXTRA_TARGETS += mytarget mytarget2

这就是实际构建自定义目标所需要做的全部工作。

可能希望将这些目标绑定到 qmake 构建目标。只需将 Makefile 目标包含在 PRE_TARGETDEPS 列表中。

自定义目标规范支持以下成员:

  • commands:用于生成自定义构建目标的命令。
  • CONFIG:自定义构建目标的特定配置选项。
  • depends:自定义构建目标所依赖的现有构建目标。
  • recurse:指定在 Makefile 中创建规则以调用子目标特定的 Makefile 时应使用哪些子目标。 
  • recurse_target:指定应通过子目标 Makefile 为 Makefile 中的规则构建的目标。
  • target:自定义构建目标的名称。

四、库依赖

通常在链接库时,qmake 依赖于底层平台来了解该库链接到哪些其他库,并让平台将它们拉入。然而,在许多情况下,这还不够。 例如,在静态链接库时,不会链接其他库,因此不会创建对这些库的依赖项。如果明确启用跟踪,qmake 会在适当的情况下尝试跟踪库的依赖项。

第一步是在库本身中启用依赖项跟踪。必须告诉 qmake 保存有关库的信息:

 CONFIG += create_prl

这仅适用于 lib 模板类型的工程,所有其他模板将被忽略。 启用此选项后,qmake 将创建一个以 .prl 结尾的文件,该文件将保存有关库的一些元信息。这个元文件就像一个普通的项目文件,但只包含内部变量声明。安装库时,通过在 INSTALLS 声明中将其指定为目标,qmake 会自动将 .prl 文件复制到安装路径。

第二步是在使用静态库的应用程序中启用此元信息的读取:

 CONFIG += link_prl

启用此功能后,qmake 将处理应用程序链接的所有库并找到它们的元信息。qmake 将使用它来确定相关的链接信息,特别是将值添加到应用程序项目文件的 DEFINES LIBS 列表中。 一旦 qmake 处理了这个文件,它就会查看 LIBS 变量中新引入的库,并找到它们依赖的 .prl 文件,直到所有库都被解析为止。此时,Makefile 照常创建,并且库与应用程序显式链接。

.prl 文件应仅由 qmake 创建,不应在操作系统之间传输,因为它们可能包含平台相关信息。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144592.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • win11安装node并且配置环境变量

    win11安装node并且配置环境变量npm使用过程中的一些错误解决办法及npm常用命令和技巧-世有因果知因求果-博客园用户名是自己的C:\Users\KenKen\AppData\Roaming\npmNODE_PATHC:\ProgramFiles\nodejs\node_modules

  • lvs环境搭建

    lvs环境搭建参考:https://blog.csdn.net/Ki8Qzvka6Gz4n450m/article/details/79119665http://www.cnblogs.com/klb561/p/9215667.html补充了设置vip的方法以及一些解释性东西。 负载均衡集群是loadbalance集群的简写,翻译成中文就是负载均衡集群。常用的负载均衡开源软件有nginx、…

  • textmate 快捷技巧

    textmate 快捷技巧textmate快捷技巧文章分类:综合技术高手都是可以不用鼠标的,恩,向高手学习.textmate的快捷键忒多了:自动补全:esc查找项目文件:command+t查找文件内符号:shift+command+t跳到某行:command+l选择:shift+方向键向后缩进:option+tab向前缩进:shift+option+tabreformat所选:option+command+[大写所选:control+u小写所选:

  • 解决:Failed to convert value of type ‘java.lang.String‘ to required type ‘java.util.Date‘;

    解决:Failed to convert value of type ‘java.lang.String‘ to required type ‘java.util.Date‘;发生这一错误的主要原因是Controller类中需要接收的是Date类型,但是在页面端传过来的是String类型,最终导致了这个错误。这里提供两种解决方案,一种是局部转换,一种是全局转换。一.局部转换@ControllerpublicclassUserController{ @RequestMapping(value=”/login.do”) publicStr

  • qi接收启动协议_基于QI协议的无线充电通信系统「建议收藏」

    qi接收启动协议_基于QI协议的无线充电通信系统「建议收藏」龙源期刊网http://doc.docsou.com基于QI协议的无线充电通信系统作者:胡江浩张中炜来源:《中国新通信》2016年第03期【摘要】无线充电技术的学名又叫做无线电能传输,其原理非常类似于变压器,都是通过发射电路产生一个交变电流通过初级线圈,从而在初级线圈上感应出一个交变电磁场,次级线圈通过接收该交变电磁场从而产生感应电流,通过电磁感应实现能源的传输。该文主要介绍了一种无线充电领域中…

  • Gradle教程「建议收藏」

    Gradle教程「建议收藏」1.简介在本课程中,我们将学习Gradle,它是一个构建工具和一个依赖管理系统,与Maven和Ant非常相似,并且专门用于构建基于Java的项目。与Maven和Ant构建系统不同,Gradle不使用XML。它实际上是基于Groovy构建在DSL中的。与基于XML的其他构建系统相比,基于Groovy的Gradle脚本的最大优势是可以使构建脚本更小,更简洁。就像Maven构建文件…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号