【问题标题】:How to add pre processing defs (macros) to qt creator?如何将预处理defs(宏)添加到qt creator?
【发布时间】:2010-09-06 09:42:53
【问题描述】:

在 Eclipse 中,可以使用路径和符号中的符号选项为项目指定预处理定义(#ifdef 宏)。这有助于有效索引跨平台的代码。 Qt creator 中是否可以提供这些选项?

【问题讨论】:

    标签: qt qt-creator


    【解决方案1】:

    这取决于:-)

    以下假设您使用的是基于 qmake 的项目:

    首先您可以将DEFINES += SOME_DEFINE=value 添加到您的.pro 文件中。这是在 creator 内部和在命令行上构建时提取的,并且在从 .pro 文件创建 MSVC 或 XCode 项目时也应该显示出来。

    然后您可以将DEFINES += SOME_DEFINE=value 添加到Qt Creator 在配置项目时将发出的qmake 调用中。这发生在项目模式、构建设置、QMake 步骤中。

    最后,您可以将#define SOME_DEFINE 值留置权放入头文件并包含它。这适用于各种项目:-)

    【讨论】:

    • 不,我不使用 qtcreator 进行构建。我想要它不仅仅是因为它强大的索引。
    • 而且我的项目不是基于 qmake 的。
    • +1 这可能对原始发帖人没有帮助,但这是谷歌上“qtcreator 定义”的热门歌曲,我们中的许多人都在使用 qmake 并在 qtcreator 中构建。谢谢!
    • 如果您使用的是通用项目:您可以将定义添加到 PROJECTNAME.defines,如果您使用的是 cmake:添加定义到您的 CMakeLists.txt,如果您使用的是 autotools:您不走运IIRC,Creator 无法从 configure.ac 获取定义:-) 但是那些往往最终会出现在一些包含的头文件中。这也很好用。
    • 将定义添加到 .pro 文件时,您必须在 qtcreator 中进行清理和重建。希望这个技巧可以在一天内为某人节省 10 分钟。
    【解决方案2】:

    来自QT Documentation

    定义在 .config 文件中指定。 .config 文件是一个 常规 C++ 文件,在所有源文件中添加 解析。仅使用 .config 文件添加行,如示例中所示 下面:

    #define NAME value
    

    也就是说,如果你导入一个名为 MyProject 的项目,那么预处理器定义应该在 MyProject.config 中指定

    对于我的项目,它会导致索引器在整个项目范围内识别此定义并更改自动完成以反映这一点。

    【讨论】:

    • 我没试过这个。我不再在 Qt 工作。但我认为从您的回答来看,这可能是正确的。所以现在接受它供其他人使用。
    • 这在我按照文档说的那样工作并且“仅使用 .config 文件添加行,如下例所示”。我希望“.config 文件是一个常规的 C++ 文件”意味着我也可以在其中使用 #ifdef/#else/#endif,但会给出奇怪的结果。这应该有效吗?
    • 我无法找到最新 Qt 版本的 .config 文件。如何找到它?文档链接似乎没有多大用处。
    【解决方案3】:

    我认为最初的答案很好,但它们要求您手动管理您的配置,而有一些方法可以让 IDE自动根据是否选择了 releasedebug 配置。

    这部分可能是多余的,但请注意,只有当你使用 IDE 进行构建时,它才对你有用。显然,如果不是这种情况,您将需要一个不同的解决方案。

    步骤

    由于图片值一千字,下面是一个示例,说明如何使用 Qt Creator 4.3.1 为调试构建定义调试宏:

    1. 确保您选择了调试配置;

    1. 转到左侧菜单上的项目部分;
    2. 转到构建部分

    1. 构建步骤下,查找Additional arguments输入框;
    2. 输入您的宏定义(例如,DEBUG 代表代码中的 #ifdef DEBUGs;在我的例子中是 __CTS_DEBUG__

    宏现在只会在您使用调试配置时定义;当您选择 Release 配置(参见步骤 1)时,它将自动变为未定义,并且您的条件编译调试代码将被删除,如下图所示,这正是您一直想要的。

    结果

    选择了调试配置

    选择 release 配置:

    【讨论】:

    • 这个解决方案不是最优的,因为这些是 QtCreator 的本地设置。每个程序员都必须重复这项工作才能编译。
    • @Moia 这个问题非常明确,它是特定于 QtCreator 的。我的回答直接解决了这个问题,并展示了如何在 QtCreator 中做到这一点。
    • @code_dredd 实际上你是对的。我收回了。
    【解决方案4】:

    我想在 .pro 文件中指定一个#define 字符串,但我的代码以不带引号的字符串内容结束。我必须转义引号,然后转义转义以使一对引号一直持续到我的代码。这是因为 qmake 去掉了一组转义和一些引号,然后命令行去掉了其余的。这对我有用:

    DEFINES += "VERSION=\"\\\"0.1.0\\\"\""
    

    在 Windows 上,这个 VERSION 字符串可以在 .rc 文件中用于创建 Windows 需要的版本内容以及“关于”菜单的代码。

    【讨论】:

    • 我遇到了类似的问题。在命令行的 bash 中,这对我有用:qmake DEFINES+="BUILD_DATE='\'\"August 17, 2016\"\''"
    【解决方案5】:

    您可以在 QtCreator 的项目设置中定义一些 PREPROCESSOR。我这里没有 QtCreator,但我记得有一个项目配置选项卡。

    【讨论】:

    • 我在项目配置中找不到这样的设置。
    • 选项卡名称为“Projects”,您可以在此处添加预处理器定义来自定义编译
    • 我不使用 qt creator 进行编译。我用它来索引。
    • 您可以使用 \d 选项在编译器参数中添加预处理器。示例:g++ -D NAME[=Value]
    • 这行不通。我不使用 qt creator 进行编译。我用它来索引。看起来 qt creator 没有静态解释代码的功能。
    【解决方案6】:

    @Tobias Hunger 回答的第一个建议对我有用。我在我的 .pro 文件中这样做:

    DEFINE += KEY=value

    直到我将其更改为:

    DEFINES += KEY=value

    也就是说,如果你想从命令行做所有事情,这里描述了一个几乎混合的解决方案,它不使用 Qt Creator GUI,但使用 .pro 文件:

    https://www.linux.org/threads/c-tutorial-create-qt-applications-without-qtcreator.18409/

    使用上面链接中描述的方法,您可以使用qtcreator -project 生成一个.pro 文件,然后使用notepadvim 或其他一些文本编辑器将DEFINES += KEY=value 行添加到@ 987654330@ 刚刚创建的文件。然后直接使用 qmake:qmake <your_project>.pro,进行 Qt 预处理,最后只需 make 构建可执行文件。

    我还听说过使用qtcreator -D 选项从命令行添加预处理器定义的传说,如下所述: https://doc.qt.io/archives/qt-4.8/qmake-variable-reference.html#defines 但我从未尝试过。

    希望对你有用!您对 CLI 的奉献精神令人钦佩。

    【讨论】:

      猜你喜欢
      • 2019-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 2012-02-17
      • 1970-01-01
      • 2015-01-11
      • 2019-09-23
      相关资源
      最近更新 更多