如何通过 Qt 项目文件将命令的输出作为编译器标志传递?

Posted

技术标签:

【中文标题】如何通过 Qt 项目文件将命令的输出作为编译器标志传递?【英文标题】:How can I pass the output of a command as a compiler flag through a Qt project file? 【发布时间】:2009-05-12 12:14:35 【问题描述】:

我正在尝试将“git describe”的输出添加到我的应用程序的 about 窗口,以便更容易找出人们使用的应用程序版本。

我可以通过添加以下编译器标志来做到这一点: -DAPP_VERSION="$(git describe HEAD)"

但是由于项目是基于qmake的,我想想办法把这个放到Qt项目文件中。 这可能吗?如果有,怎么做?

编辑: 我尝试添加以下内容:

QMAKE_CXXFLAGS += -DAPP_VERSION="$(git describe HEAD)"

但它只是给了我“-DAPP_VERSION=”,所以我想我必须使用一些转义字符,但我不知道哪些以及在哪里。 :/

【问题讨论】:

【参考方案1】:

问题通过此链接解决:http://robertcarlsen.net/blog/2009/01/06/qmake-xcode-bug-258

这是我用来测试它的示例 qt 项目: qt.pro:

######################################################################
# Automatically generated by qmake (2.01a) Thu Apr 2 16:23:05 2009
######################################################################

TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

# Input
SOURCES += qt.cpp

QMAKE_CXXFLAGS += -DAPP_DATE=\\\"`date +'\"%a_%b_%d,_%Y\"'`\\\"
QMAKE_CXXFLAGS += -DAPP_VERSION=\\\"`git describe`\\\"

qt.cpp:

#ifndef APP_DATE
#define APP_DATE "1/1/1970"
#endif

#ifndef APP_VERSION
#define APP_VERSION "local-dev"
#endif

#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])

    QApplication app(argc, argv);
    QString version = QString("version ") + APP_VERSION + ' ' + APP_DATE;
    QLabel *label = new QLabel(version);
    label->show();
    return app.exec();

【讨论】:

这不是和上面描述的一样吗?如果你切换分支并且 qt.pro 和 qt.cpp 没有改变,它不会被重新编译......但是另一个分支可能在其他文件中有变化(并且也有不同的哈希)【参考方案2】:

你也可以使用

QMAKE_CXXFLAGS += -DAPP_VERSION=\\\"$$system(git describe HEAD)\\\"

这将在 qmake 运行期间只执行一次 git 命令,这可能会加快大型项目的编译速度。但是,您必须确保在从存储库中提取后运行 qmakemake clean

【讨论】:

不健壮,因为很容易错过任何更改(例如脏)。 此功能对于提供给其他人的构建是必需的。在这种情况下,您应该有一个构建脚本,以确保树不脏并且完成了完整的重建(包括 qmake 运行)。

以上是关于如何通过 Qt 项目文件将命令的输出作为编译器标志传递?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 编译器标志顺序

来自命令行的 xcodebuild:文件的编译标志

waf : 将编译器标志传递给 qt 的 moc

Visual Studio C++ 编译器标志:-Zm200 是啥?

Qt 多项目管理

Qt中将编译输出路径设置在其他文件