clang 忽略包含文件的 -std=c++11 标志
clang ignores -std=c++11 flag for include files
我有一些代码,我使用(旧的)Mersenne Twister 头文件来获得一个好的伪随机数生成器。
问题在于该代码使用 register
关键字(据我所知)在 c++11
中已被弃用,并在 c++17
中抛出错误。我相信我在 clang
版本中使用后者,我在 Mac OSX (10.14.6; Mojave).
上使用
我使用的Makefile是这样的:
BUILDDIR=$(TOPDIR)/bin
INCDIROUT=$(BUILDDIR)/include
LIBDIROUT=$(BUILDDIR)/lib
INCDIR=inc/
SRCDIR=src/
INCFLAG= -IMersenne -Iinc
LIBFLAG= -L. -L$(LIBDIROUT)
#need to use an older version of gcc b/c of Mersenne Twister using the deprecated `register` keyword
#https://github.com/danini/graph-cut-ransac/issues/23
CXX=clang++
#CXXFLAGS=-g -std=c++11 -Wall -pedantic
CXXFLAGS=-fpermissive -std=c++98
#trick for getting the git version in the code
GIT_VERSION = $(shell sh -c 'git describe --abbrev=4 --always')
CFLAGS += -D__GIT_VERSION=\"$(GIT_VERSION)\"
RUN_SCRIPT := $(shell mkdir -p 'bin/lib')
all: $(BUILDDIR)/realizeCascades $(LIBDIROUT)/rootUtil.o $(LIBDIROUT)/edepmath.o $(LIBDIROUT)/cascadeProd.o $(LIBDIROUT)/isotope_info.o $(LIBDIROUT)/weisskopf.o $(LIBDIROUT)/lindhard.o $(LIBDIROUT)/libncap.so
$(LIBDIROUT)/isotope_info.o: $(SRCDIR)/isotope_info.c $(INCDIR)/isotope_info.h
$(CXX) -std=c++98 -fPIC -c $(CFLAGS) $(INCFLAG) $(SRCDIR)/isotope_info.c `root-config --cflags --glibs` $(LIBFLAG)
mv isotope_info.o $(LIBDIROUT)/
$(LIBDIROUT)/rootUtil.o: $(SRCDIR)/rootUtil.c $(INCDIR)/rootUtil.h
$(CXX) -std=c++98 -fPIC -c $(CFLAGS) $(INCFLAG) $(SRCDIR)/rootUtil.c `root-config --cflags --glibs` $(LIBFLAG)
mv rootUtil.o $(LIBDIROUT)/
$(LIBDIROUT)/edepmath.o: $(SRCDIR)/edepmath.c $(INCDIR)/edepmath.h
$(CXX) -std=c++98 -fPIC -c $(CFLAGS) $(INCFLAG) $(SRCDIR)/edepmath.c `root-config --cflags --glibs` $(LIBFLAG)
mv edepmath.o $(LIBDIROUT)/
$(LIBDIROUT)/weisskopf.o: $(SRCDIR)/weisskopf.c $(INCDIR)/weisskopf.h
$(CXX) -std=c++98 -fPIC -c $(CFLAGS) $(INCFLAG) $(SRCDIR)/weisskopf.c `root-config --cflags --glibs` $(LIBFLAG)
mv weisskopf.o $(LIBDIROUT)/
$(LIBDIROUT)/lindhard.o: $(SRCDIR)/lindhard.c $(INCDIR)/lindhard.h
$(CXX) -std=c++98 -fPIC -c $(CFLAGS) $(INCFLAG) $(SRCDIR)/lindhard.c `root-config --cflags --glibs` $(LIBFLAG)
mv lindhard.o $(LIBDIROUT)/
$(LIBDIROUT)/cascadeProd.o: $(SRCDIR)/cascadeProd.c $(INCDIR)/cascadeProd.h
$(CXX) -std=c++98 -fPIC -c $(CFLAGS) $(INCFLAG) $(SRCDIR)/cascadeProd.c `root-config --cflags --glibs` $(LIBFLAG)
mv cascadeProd.o $(LIBDIROUT)/
$(LIBDIROUT)/libncap.so: $(LIBDIROUT)/isotope_info.o $(LIBDIROUT)/weisskopf.o $(LIBDIROUT)/lindhard.o $(LIBDIROUT)/cascadeProd.o $(LIBDIROUT)/edepmath.o $(LIBDIROUT)/rootUtil.o
$(CXX) -std=c++98 -fPIC -shared $(LIBDIROUT)/lindhard.o $(LIBDIROUT)/weisskopf.o $(LIBDIROUT)/isotope_info.o $(LIBDIROUT)/cascadeProd.o $(LIBDIROUT)/edepmath.o $(LIBDIROUT)/rootUtil.o `root-config --cflags --glibs` -o $(LIBDIROUT)/libncap.so
$(BUILDDIR)/realizeCascades: $(LIBDIROUT)/libncap.so $(BUILDDIR)/realizeCascades.cpp
$(CXX) -std=c++98 -fPIC -Wl,-rpath=$(LIBDIROUT) $(CFLAGS) $(INCFLAG) $(LIBFLAG) $(BUILDDIR)/realizeCascades.cpp `root-config --cflags --glibs` -lncap -o $(BUILDDIR)/realizeCascades
clean:
rm -f $(LIBDIROUT)/*.o
rm -f $(LIBDIROUT)/*.so
rm -f $(BUILDDIR)/realizeCascades
rm -f *.o
rm -f *.so
rm -rf $(LIBDIROUT)
尽管使用 -std=c++11
或 -std=c++98
标志,一旦 makefile 开始编译 lindhard.c
如下:
clang++ -std=c++98 -fPIC -c -D__GIT_VERSION=\"v1.0.6-73-g01bc\"
-IMersenne -Iinc src//lindhard.c `root-config --cflags --glibs` -L. -L/Users/villaa/nrCascadeSim/bin/lib
每次使用 register
关键字都会引发错误:
Mersenne/MersenneTwister.hh:187:2: error: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
register uint32 s1;
^~~~~~~~~
我正在努力找出造成这种情况的原因。 -std
标志是否未应用于包含文件的预处理?我是不是用错了方法?
@MadScientist 和@idz 上面是正确的。关键是使用 root-config --cflags --glibs
时的根库添加了以下内容:
-stdlib=libc++ -pthread -std=c++17 -m64 -I/usr/local/Cellar/root/6.24.04/include/root -L/usr/local/Cellar/root/6.24.04/lib/root -lGui -lCore -lImt -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lROOTVecOps -lTree -lTreePlayer -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -lMultiProc -lROOTDataFrame -stdlib=libc++ -lpthread -lm -ldl
这是在我的旗帜-std=c++98
之后出现的,因此覆盖了它。
这里的解决方案是将 -std=c++98
移到 root-config
行之后。
我想我使用的一些 ROOT
代码 需要 c++17
在技术上是可能的,然后我不确定这是否本来可以解决的。
但事实证明,我使用的是 ROOT
代码库的一部分,该代码库较旧并且可能(尽管我仍然不确定)没有任何需要 c++17
的升级.
如果是的话,我想我唯一的选择就是更新我的不兼容库 Mersenne,使其与 c++17
兼容
PS:我知道 Mersenne Twister 现在是用 C++ 标准代码实现的,但出于某些原因我更喜欢使用我的旧实现。
我有一些代码,我使用(旧的)Mersenne Twister 头文件来获得一个好的伪随机数生成器。
问题在于该代码使用 register
关键字(据我所知)在 c++11
中已被弃用,并在 c++17
中抛出错误。我相信我在 clang
版本中使用后者,我在 Mac OSX (10.14.6; Mojave).
我使用的Makefile是这样的:
BUILDDIR=$(TOPDIR)/bin
INCDIROUT=$(BUILDDIR)/include
LIBDIROUT=$(BUILDDIR)/lib
INCDIR=inc/
SRCDIR=src/
INCFLAG= -IMersenne -Iinc
LIBFLAG= -L. -L$(LIBDIROUT)
#need to use an older version of gcc b/c of Mersenne Twister using the deprecated `register` keyword
#https://github.com/danini/graph-cut-ransac/issues/23
CXX=clang++
#CXXFLAGS=-g -std=c++11 -Wall -pedantic
CXXFLAGS=-fpermissive -std=c++98
#trick for getting the git version in the code
GIT_VERSION = $(shell sh -c 'git describe --abbrev=4 --always')
CFLAGS += -D__GIT_VERSION=\"$(GIT_VERSION)\"
RUN_SCRIPT := $(shell mkdir -p 'bin/lib')
all: $(BUILDDIR)/realizeCascades $(LIBDIROUT)/rootUtil.o $(LIBDIROUT)/edepmath.o $(LIBDIROUT)/cascadeProd.o $(LIBDIROUT)/isotope_info.o $(LIBDIROUT)/weisskopf.o $(LIBDIROUT)/lindhard.o $(LIBDIROUT)/libncap.so
$(LIBDIROUT)/isotope_info.o: $(SRCDIR)/isotope_info.c $(INCDIR)/isotope_info.h
$(CXX) -std=c++98 -fPIC -c $(CFLAGS) $(INCFLAG) $(SRCDIR)/isotope_info.c `root-config --cflags --glibs` $(LIBFLAG)
mv isotope_info.o $(LIBDIROUT)/
$(LIBDIROUT)/rootUtil.o: $(SRCDIR)/rootUtil.c $(INCDIR)/rootUtil.h
$(CXX) -std=c++98 -fPIC -c $(CFLAGS) $(INCFLAG) $(SRCDIR)/rootUtil.c `root-config --cflags --glibs` $(LIBFLAG)
mv rootUtil.o $(LIBDIROUT)/
$(LIBDIROUT)/edepmath.o: $(SRCDIR)/edepmath.c $(INCDIR)/edepmath.h
$(CXX) -std=c++98 -fPIC -c $(CFLAGS) $(INCFLAG) $(SRCDIR)/edepmath.c `root-config --cflags --glibs` $(LIBFLAG)
mv edepmath.o $(LIBDIROUT)/
$(LIBDIROUT)/weisskopf.o: $(SRCDIR)/weisskopf.c $(INCDIR)/weisskopf.h
$(CXX) -std=c++98 -fPIC -c $(CFLAGS) $(INCFLAG) $(SRCDIR)/weisskopf.c `root-config --cflags --glibs` $(LIBFLAG)
mv weisskopf.o $(LIBDIROUT)/
$(LIBDIROUT)/lindhard.o: $(SRCDIR)/lindhard.c $(INCDIR)/lindhard.h
$(CXX) -std=c++98 -fPIC -c $(CFLAGS) $(INCFLAG) $(SRCDIR)/lindhard.c `root-config --cflags --glibs` $(LIBFLAG)
mv lindhard.o $(LIBDIROUT)/
$(LIBDIROUT)/cascadeProd.o: $(SRCDIR)/cascadeProd.c $(INCDIR)/cascadeProd.h
$(CXX) -std=c++98 -fPIC -c $(CFLAGS) $(INCFLAG) $(SRCDIR)/cascadeProd.c `root-config --cflags --glibs` $(LIBFLAG)
mv cascadeProd.o $(LIBDIROUT)/
$(LIBDIROUT)/libncap.so: $(LIBDIROUT)/isotope_info.o $(LIBDIROUT)/weisskopf.o $(LIBDIROUT)/lindhard.o $(LIBDIROUT)/cascadeProd.o $(LIBDIROUT)/edepmath.o $(LIBDIROUT)/rootUtil.o
$(CXX) -std=c++98 -fPIC -shared $(LIBDIROUT)/lindhard.o $(LIBDIROUT)/weisskopf.o $(LIBDIROUT)/isotope_info.o $(LIBDIROUT)/cascadeProd.o $(LIBDIROUT)/edepmath.o $(LIBDIROUT)/rootUtil.o `root-config --cflags --glibs` -o $(LIBDIROUT)/libncap.so
$(BUILDDIR)/realizeCascades: $(LIBDIROUT)/libncap.so $(BUILDDIR)/realizeCascades.cpp
$(CXX) -std=c++98 -fPIC -Wl,-rpath=$(LIBDIROUT) $(CFLAGS) $(INCFLAG) $(LIBFLAG) $(BUILDDIR)/realizeCascades.cpp `root-config --cflags --glibs` -lncap -o $(BUILDDIR)/realizeCascades
clean:
rm -f $(LIBDIROUT)/*.o
rm -f $(LIBDIROUT)/*.so
rm -f $(BUILDDIR)/realizeCascades
rm -f *.o
rm -f *.so
rm -rf $(LIBDIROUT)
尽管使用 -std=c++11
或 -std=c++98
标志,一旦 makefile 开始编译 lindhard.c
如下:
clang++ -std=c++98 -fPIC -c -D__GIT_VERSION=\"v1.0.6-73-g01bc\"
-IMersenne -Iinc src//lindhard.c `root-config --cflags --glibs` -L. -L/Users/villaa/nrCascadeSim/bin/lib
每次使用 register
关键字都会引发错误:
Mersenne/MersenneTwister.hh:187:2: error: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
register uint32 s1;
^~~~~~~~~
我正在努力找出造成这种情况的原因。 -std
标志是否未应用于包含文件的预处理?我是不是用错了方法?
@MadScientist 和@idz 上面是正确的。关键是使用 root-config --cflags --glibs
时的根库添加了以下内容:
-stdlib=libc++ -pthread -std=c++17 -m64 -I/usr/local/Cellar/root/6.24.04/include/root -L/usr/local/Cellar/root/6.24.04/lib/root -lGui -lCore -lImt -lRIO -lNet -lHist -lGraf -lGraf3d -lGpad -lROOTVecOps -lTree -lTreePlayer -lRint -lPostscript -lMatrix -lPhysics -lMathCore -lThread -lMultiProc -lROOTDataFrame -stdlib=libc++ -lpthread -lm -ldl
这是在我的旗帜-std=c++98
之后出现的,因此覆盖了它。
这里的解决方案是将 -std=c++98
移到 root-config
行之后。
我想我使用的一些 ROOT
代码 需要 c++17
在技术上是可能的,然后我不确定这是否本来可以解决的。
但事实证明,我使用的是 ROOT
代码库的一部分,该代码库较旧并且可能(尽管我仍然不确定)没有任何需要 c++17
的升级.
如果是的话,我想我唯一的选择就是更新我的不兼容库 Mersenne,使其与 c++17
PS:我知道 Mersenne Twister 现在是用 C++ 标准代码实现的,但出于某些原因我更喜欢使用我的旧实现。