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

Iro*_*ney 5 qmake makefile clang qt-creator c++17

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

现在,当调用clang来构建项目时(由于某种原因,我的Clang Relase,Clang Debug和GCC Debug构建......)我从.pro文件中添加了这个额外的编译器标志:

-std=gnu++11
Run Code Online (Sandbox Code Playgroud)

使用我的GCC Release kit(实际调用gcc编译器而不是clang)进行构建时,不会发生这种情况.这个额外的标志覆盖了早期的标志:

-std=c++17
Run Code Online (Sandbox Code Playgroud)

...因为.pro文件中的行而添加:

QMAKE_CXXFLAGS += -std=c++17
Run Code Online (Sandbox Code Playgroud)

我查看了每个构建的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
Run Code Online (Sandbox Code Playgroud)

现在,我已经查看了我能想到的所有选项,包括每个构建工具包的设置,我不能在我的生活中找出这个错误来自哪里.

知道为什么QMake会添加这个额外的标志,为什么特别为我的Clang构建?知道在QtCreator中我会改变这个吗?我已经尝试更改makefile,但显然QMake在我再次尝试构建时添加了imposter标志.

编辑:

我已经通过下面的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
Run Code Online (Sandbox Code Playgroud)

路径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
Run Code Online (Sandbox Code Playgroud)

这是整个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"
Run Code Online (Sandbox Code Playgroud)

这是整个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      =
Run Code Online (Sandbox Code Playgroud)

val*_*ano 4

我对 QtCreator 不太熟悉,但使用以下命令设置 C++17 可能会有更好的运气CONFIG

CONFIG += c++1z

如果CONFIG设置为c++11,则可以解释-std=gnu++11添加该标志的原因。

使用CONFIG应该让 QMake 选择正确的 mkspec 并设置QMAKE_CXXFLAGS所需的-std标志。