makefile - 当我使用使用 Clang 编译的构建工具包时,QMake 添加了额外的 "-std=gnu++11",它覆盖了我的 .pro 标志添加 "-std=c++17"

标签 makefile clang qt-creator c++17 qmake

我正在使用 QtCreator、Qt 5.10,并尝试在一个完美运行的项目中使用 c++17,直到我全新安装了最新的 Ubuntu 并重新安装了所有内容。

现在,当调用 clang 来构建项目时(出于某种原因,我的 Clang Relase、Clang Debug 和 GCC Debug 构建...

-std=gnu++11

使用我的 GCC Release 工具包(实际上调用 gcc 编译器而不是 clang 的工具包)构建时不会发生这种情况。这个额外的标志覆盖了之前的标志:
-std=c++17

...这是因为我的 .pro 文件中的一行而添加的:
QMAKE_CXXFLAGS += -std=c++17

我查看了每个构建的 makefile,这是 Clang Release 构建的 Makefile:
#############################################################################
# Makefile for building: AIRadioQt
# Generated by qmake (3.1) (Qt 5.10.0)
# Project:  ../AIRadioQt/AIRadioQt.pro
# Template: app
# Command: /home/pete/Programming/Qt/5.10.0/gcc_64/bin/qmake -o Makefile ../AIRadioQt/AIRadioQt.pro -spec linux-clang
#############################################################################

MAKEFILE      = Makefile

####### Compiler, tools and options

CC            = clang
CXX           = clang++
DEFINES       = -DQT_DEPRECATED_WARNINGS -DQT_NO_DEBUG -DQT_DATAVISUALIZATION_LIB -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB
CFLAGS        = -pipe -O2 -Wall -W -D_REENTRANT -fPIC $(DEFINES)
CXXFLAGS      = -pipe -std=c++17 -O2 -std=gnu++11 -Wall -W -D_REENTRANT -fPIC $(DEFINES)
INCPATH       = -I../AIRadioQt -I. -I../src -I../src/AIBase -I../src/Maths -I../src/Random -isystem /usr/local/include/csound -isystem /usr/include/GL -I../../../../Programming/Qt/5.10.0/gcc_64/include -I../../../../Programming/Qt/5.10.0/gcc_64/include/QtDataVisualization -I../../../../Programming/Qt/5.10.0/gcc_64/include/QtWidgets -I../../../../Programming/Qt/5.10.0/gcc_64/include/QtGui -I../../../../Programming/Qt/5.10.0/gcc_64/include/QtCore -I. -isystem /usr/include/libdrm -I. -I../../../../Programming/Qt/5.10.0/gcc_64/mkspecs/linux-clang
QMAKE         = /home/pete/Programming/Qt/5.10.0/gcc_64/bin/qmake
DEL_FILE      = rm -f
CHK_DIR_EXISTS= test -d
MKDIR         = mkdir -p
COPY          = cp -f
COPY_FILE     = cp -f
COPY_DIR      = cp -f -R
INSTALL_FILE  = install -m 644 -p
INSTALL_PROGRAM = install -m 755 -p
INSTALL_DIR   = cp -f -R
QINSTALL      = /home/pete/Programming/Qt/5.10.0/gcc_64/bin/qmake -install qinstall
QINSTALL_PROGRAM = /home/pete/Programming/Qt/5.10.0/gcc_64/bin/qmake -install qinstall -exe
DEL_FILE      = rm -f
SYMLINK       = ln -f -s
DEL_DIR       = rmdir
MOVE          = mv -f
TAR           = tar -cf
COMPRESS      = gzip -9f
DISTNAME      = AIRadioQt1.0.0
DISTDIR = /home/pete/Documents/AlgorythmRadio/AIRadio/build-AIRadioQt-Desktop_Qt_5_10_0_Clang_64bit-Release/.tmp/AIRadioQt1.0.0
LINK          = clang++
LFLAGS        = -ccc-gcc-name g++ -Wl,-rpath,/home/pete/Programming/Qt/5.10.0/gcc_64/lib
LIBS          = $(SUBLIBS) -L/usr/local/lib -lcsnd6 -lcsound64 -L/home/pete/Programming/Qt/5.10.0/gcc_64/lib -lQt5DataVisualization -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 
AR            = ar cqs
RANLIB        = 
SED           = sed
STRIP         = strip

现在,我已经查看了我能想到的所有选项,包括每个构建套件的设置,但我终生无法弄清楚这个错误的来源。

知道为什么 QMake 会添加这个额外的标志,以及为什么专门针对我的 Clang 构建?知道在 QtCreator 中我会去哪里改变这个吗?我曾尝试更改 makefile,但显然 QMake 在我尝试再次构建时重新添加了冒名顶替者标志。

编辑:

我已经按照下面 valiano 的建议尝试通过 Qt 配置文件进行 grep,但到目前为止我还没有发现任何问题。包含“-std=gnu++11”的文件如下:
/"path-to-qt"/mkspecs/common/qcc-base-qnx.conf
/"path-to-qt"/mkspecs/common/clang.conf
/"path-to-qt"/mkspecs/common/android-base-tail.conf
/"path-to-qt"/mkspecs/common/g++-base.conf
/"path-to-qt"/mkspecs/linux-icc/qmake.conf
/"path-to-qt"/mkspecs/macx-icc/qmake.conf
/"path-to-qt"/mkspecs/features/qt_module_headers.prf

路径 1、2 和 4 是唯一似乎与我的情况相关的路径,它们都没有包含任何看起来不寻常的东西。

qcc-base-qnx.conf 包含以下几行:
QMAKE_CXXFLAGS_CXX11    = -Wc,-std=gnu++11
QMAKE_CXXFLAGS_CXX14    = -Wc,-std=gnu++1y
QMAKE_CXXFLAGS_CXX1Z    = -Wc,-std=gnu++1z

QMAKE_LINK_C            = $$QMAKE_CC
QMAKE_LINK_C_SHLIB      = $$QMAKE_CC

QMAKE_LINK              = $$QMAKE_CXX
QMAKE_LINK_SHLIB        = $$QMAKE_CXX

这是整个 clang.conf 文件:
QMAKE_COMPILER          = gcc clang llvm   # clang pretends to be gcc

QMAKE_CC                = clang
QMAKE_CXX               = clang++

QMAKE_LINK_C            = $$QMAKE_CC
QMAKE_LINK_C_SHLIB      = $$QMAKE_CC

QMAKE_LINK              = $$QMAKE_CXX
QMAKE_LINK_SHLIB        = $$QMAKE_CXX

CONFIG                 += clang_pch_style
QMAKE_PCH_OUTPUT_EXT    = .pch

QMAKE_CFLAGS_ISYSTEM             = -isystem
QMAKE_CFLAGS_PRECOMPILE          = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
QMAKE_CFLAGS_USE_PRECOMPILE      = -Xclang -include-pch -Xclang ${QMAKE_PCH_OUTPUT}
QMAKE_CFLAGS_LTCG                = -flto
QMAKE_CFLAGS_DISABLE_LTCG        = -fno-lto

QMAKE_CXXFLAGS_PRECOMPILE        = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
QMAKE_CXXFLAGS_USE_PRECOMPILE    = $$QMAKE_CFLAGS_USE_PRECOMPILE
QMAKE_CXXFLAGS_LTCG              = $$QMAKE_CFLAGS_LTCG
QMAKE_CXXFLAGS_DISABLE_LTCG      = $$QMAKE_CFLAGS_DISABLE_LTCG
QMAKE_CXXFLAGS_CXX11             = -std=c++11
QMAKE_CXXFLAGS_CXX14             = -std=c++1y
QMAKE_CXXFLAGS_CXX1Z             = -std=c++1z
QMAKE_CXXFLAGS_GNUCXX11          = -std=gnu++11
QMAKE_CXXFLAGS_GNUCXX14          = -std=gnu++1y
QMAKE_CXXFLAGS_GNUCXX1Z          = -std=gnu++1z

QMAKE_LFLAGS_CXX11      =
QMAKE_LFLAGS_CXX14      =
QMAKE_LFLAGS_CXX1Z      =
QMAKE_LFLAGS_LTCG       = $$QMAKE_CFLAGS_LTCG

# Wrapper tools that understand .o/.a files with LLVM bytecode instead of machine code
QMAKE_AR_LTCG           = llvm-ar cqs
QMAKE_NM_LTCG           = llvm-nm -P
QMAKE_RANLIB_LTCG       = true      # No need to run, since llvm-ar has "s"

这是整个 g++base.conf 文件:
QMAKE_COMPILER          = gcc

QMAKE_CC                = gcc

QMAKE_LINK_C            = $$QMAKE_CC
QMAKE_LINK_C_SHLIB      = $$QMAKE_CC

QMAKE_CXX               = g++

QMAKE_LINK              = $$QMAKE_CXX
QMAKE_LINK_SHLIB        = $$QMAKE_CXX

QMAKE_PCH_OUTPUT_EXT    = .gch

QMAKE_CFLAGS_PRECOMPILE       = -x c-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
QMAKE_CFLAGS_USE_PRECOMPILE   = -include ${QMAKE_PCH_OUTPUT_BASE}
QMAKE_CXXFLAGS_PRECOMPILE     = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE

QMAKE_CXXFLAGS_CXX11    = -std=c++11
QMAKE_CXXFLAGS_CXX14    = -std=c++1y
QMAKE_CXXFLAGS_CXX1Z    = -std=c++1z
QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_LFLAGS_CXX11      =
QMAKE_LFLAGS_CXX14      =
QMAKE_LFLAGS_CXX1Z      =

最佳答案

我对 QtCreator 不太熟悉,但是您可能会使用 CONFIG 来设置 C++17 的运气更好。 :
CONFIG += c++1z
CONFIG设置为 c++11 ,这可以解释为什么 -std=gnu++11添加标志。

使用 CONFIG应该让 QMake 选择正确的 mkspec 并设置 QMAKE_CXXFLAGS有需要的 -std旗帜。

关于makefile - 当我使用使用 Clang 编译的构建工具包时,QMake 添加了额外的 "-std=gnu++11",它覆盖了我的 .pro 标志添加 "-std=c++17",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47931505/

相关文章:

c - 如果在 Linux 内核中执行 make C=1 或 make C=2,检查器工具如何执行?

c++ - 在 travis for clang 上使用不同的 libc++ 版本

c++ - 如何在 Clang 中获取条件右括号的位置?

c++ - LLVM-如何通过函数的真实/原始名称获取函数

c++ - 无法在 QtCreator 中使用 g++ 7.2 使用 c++17 功能

c++ - qt 应用程序和 std::shared_ptr

c++ - 如何在不使用 makefile 的情况下链接目标文件和库

linux - 如何读取和打印 makefile 目标中的文件内容(某些设置)?

c++ - 我可以使用 LLVM 来加速构建并减少 GCC 编译时间吗?

c++ - 在控制台应用程序的 QtCreator 中强制输出