【问题标题】:Where do compiler flags come from when using qmake?使用 qmake 时编译器标志从何而来?
【发布时间】:2020-04-06 10:29:37
【问题描述】:

我有一个无法调试的 qmake 项目,因为 something 在调试模式下将-O2 -g 添加到编译器标志的末尾,覆盖了我所有的调试和优化标志。我已经为-O2 搜索了整个项目,但没有(我删除了我要发布的那个)。删除构建文件夹并再次运行 qmake 没有帮助。我正在尝试追踪添加编译器标志的内容,但我遗漏了一些东西。

可以添加编译器标志的已知事物:

  • QMAKE_CXXFLAGS - 添加所有构建中给定的标志。
  • QMAKE_CXXFLAGS_DEBUG - 添加调试版本中给出的标志。
  • QMAKE_CXXFLAGS_RELEASE - 添加发布版本中给出的标志。
  • CONFIG - 添加难以追踪的标志。 CONFIG += strict_c++CONFIG += c++17 设法没有覆盖我的 -std=c++17,但我不知道添加了哪些其他标志。 qmake 调用还包含 CONFIG+=debug 可能会或可能不会添加其他标志。我无法从the documentation 得知。
  • mkspec - 在 projects->build 中,它列出了有效的 qmake 调用,其中包括例如 -spec linux-g++,我认为其中包括 /usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++/qmake.conf,其中包括更多添加平台相关标志的文件。删除 spec 标志并没有删除不需要的 -O2 标志。它也适用于其他项目,所以它可能不是罪魁祸首。
  • TEMPLATE - 指定项目的组织方式。通常它只是APP,但这个使用subdirs,它可能会覆盖标志,因为所有子项目都需要具有相同的标志。

一个理想的答案是列出所有添加编译器标志的方法、它们的添加顺序、如何检查它们添加的标志以及如何更改它们的说明。

【问题讨论】:

    标签: qmake


    【解决方案1】:

    qmake 的作用是生成一个makefile。生成的 Makefile 仅使用来自CXXFLAGS(加上DEFINES)和INCPATH 的编译器标志生成变量,除非您有一些手工制作的规则。从生成的 makefile 中可以清楚地看到它。

    而这些make变量直接来自qmake vars,例如QMAKE_CXXFLAGSDEFINESINCLUDEPATH。 (这是在 qmake 源代码内部完成的;嗯,实际上在某些平台上这些东西可能更复杂,所以也请参考 qmake 源代码。

    现在,QMAKE_CXXFLAGS 只是一个 qmake 的变量。因此,原则上,它可以在任何 qmake 脚本的任何一行进行修改。鉴于这些脚本依赖于 OS/arch/compiler/Qt 构建选项/App 选项等,您对“理想答案”的期望太过分了。

    但是,粗略地说,qmake 按以下顺序获取其脚本(提示:查看生成的 makefile 中的完整依赖项列表):

    features/spec_pre.prf
    <QMAKE-SPEC>/qmake.conf (usually includes features/qt_config.prf and a ton of Qt-related stuff)
    features/spec_post.prf
    features/default_pre.prf
    <user project>
    features/default_post.prf
    all features/xxx.prf according to the final CONFIG value (note: order reversed!)
    

    因此,如果您在项目中遗漏了一些标志,它可能源自 default_post.prf(如发布构建的发布标志)或来自 CONFIG(即 features/xxx.prf)。

    【讨论】:

    • 很遗憾,您所写的是一厢情愿,而不是现实。例如 qmake 也清楚地使用了CXXFLAGS_DEBUG。同样不,标志不会全部收集在makefile中,因为生成makefile并使用grep -nrw -e "-O2" .找不到任何结果,因此标志来自makefile外部或不存在纯文本。我什至手动启动make 以确保没有设置奇怪的环境变量并且-O2 仍然出现。
    • @nwp 没有这样的变量CXXFLAGS_DEBUG。 Qmake 内部变量(大部分)以QMAKE_ 为前缀。您似乎混淆了 qmake 变量和 make 变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    相关资源
    最近更新 更多