使用qmake时编译器标志从哪里来?

问题描述 投票:0回答:1

我有一个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个回答
0
投票

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

并且这些make变量直接来自qmake变量,例如QMAKE_CXXFLAGSDEFINESINCLUDEPATH。 (这是在qmake源代码内部完成的;好吧,实际上,在某些平台上,东西可能会更复杂,因此也请参考qmake源代码。)]

现在,QMAKE_CXXFLAGS只是qmake的变量。因此,原则上,可以在任何qmake脚本的任何行中对其进行修改。鉴于这些脚本取决于OS / arch / compiler / Qt构建选项/应用程序选项等,因此您对“理想答案”的期望过于紧张。

但是,粗略地说,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)。

© www.soinside.com 2019 - 2024. All rights reserved.