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)
我对 QtCreator 不太熟悉,但使用以下命令设置 C++17 可能会有更好的运气CONFIG:
CONFIG += c++1z
如果CONFIG设置为c++11,则可以解释-std=gnu++11添加该标志的原因。
使用CONFIG应该让 QMake 选择正确的 mkspec 并设置QMAKE_CXXFLAGS所需的-std标志。