我有一个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做的只是产生一个makefile。除非您有一些手工规则,否则生成的Makefile仅使用CXXFLAGS
(加上DEFINES
)和INCPATH
make变量中的编译器标志。从生成的文件中可以清楚地看到它。
并且这些make变量直接来自qmake变量,例如QMAKE_CXXFLAGS
,DEFINES
和INCLUDEPATH
。 (这是在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
)。