Ich habe gerade die letzte Version von OpenCV 3.4.0 kompiliert und installiert, und ich möchte Darknet (für die Yolo-Objekterkennung) kompilieren, aber bei der Kompilierung habe ich
gcc -Iinclude/ -Isrc/ -DOPENCV `pkg-config --cflags opencv` -DGPU -I/usr/local/cuda-9.1/include/ -Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC -Ofast -DOPENCV -DGPU -c ./src/gemm.c -o obj/gemm.o
In file included from /usr/local/include/opencv2/core/types_c.h:59:0,
from /usr/local/include/opencv2/core/core_c.h:48,
from /usr/local/include/opencv2/highgui/highgui_c.h:45,
from include/darknet.h:25,
from ./src/utils.h:5,
from ./src/gemm.c:2:
/usr/local/include/opencv2/core/cvdef.h:421:4: error: #error "OpenCV 4.x+ requires enabled C++11 support"
# error "OpenCV 4.x+ requires enabled C++11 support"
^
compilation terminated due to -Wfatal-errors.
Makefile:86: recipe for target 'obj/gemm.o' failed
make: *** [obj/gemm.o] Error 1
Wie ist es möglich, weil ich in Makefile (unten) C kompiliere
GPU=1
CUDNN=0
OPENCV=1
OPENMP=0
DEBUG=0
Arch= -gencode Arch=compute_30,code=sm_30 \
-gencode Arch=compute_35,code=sm_35 \
-gencode Arch=compute_50,code=[sm_50,compute_50] \
-gencode Arch=compute_52,code=[sm_52,compute_52]
# -gencode Arch=compute_20,code=[sm_20,sm_21] \ This one is deprecated?
# This is what I use, uncomment if you know your Arch and want to specify
# Arch= -gencode Arch=compute_52,code=compute_52
VPATH=./src/:./examples
SLIB=libdarknet.so
ALIB=libdarknet.a
EXEC=darknet
OBJDIR=./obj/
CC=gcc
NVCC=nvcc
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
AR=ar
ARFLAGS=rcs
OPTS=-Ofast
LDFLAGS= -lm -pthread
COMMON= -Iinclude/ -Isrc/
CFLAGS=-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC
ifeq ($(OPENMP), 1)
CFLAGS+= -fopenmp
endif
ifeq ($(DEBUG), 1)
OPTS=-O0 -g
endif
CFLAGS+=$(OPTS)
ifeq ($(OPENCV), 1)
COMMON+= -DOPENCV
CFLAGS+= -DOPENCV
LDFLAGS+= `pkg-config --libs opencv`
COMMON+= `pkg-config --cflags opencv`
endif
ifeq ($(GPU), 1)
COMMON+= -DGPU -I/usr/local/cuda-9.1/include/
CFLAGS+= -DGPU
LDFLAGS+= -L/usr/local/cuda-9.1/lib64 -lcudart -lcublas -lcurand
endif
ifeq ($(CUDNN), 1)
COMMON+= -DCUDNN
CFLAGS+= -DCUDNN
LDFLAGS+= -lcudnn
endif
OBJ=gemm.o utils.o cuda.o deconvolutional_layer.o convolutional_layer.o list.o image.o activations.o im2col.o col2im.o blas.o crop_layer.o dropout_layer.o maxpool_layer.o softmax_layer.o data.o matrix.o network.o connected_layer.o cost_layer.o parser.o option_list.o detection_layer.o route_layer.o upsample_layer.o box.o normalization_layer.o avgpool_layer.o layer.o local_layer.o shortcut_layer.o logistic_layer.o activation_layer.o rnn_layer.o gru_layer.o crnn_layer.o demo.o batchnorm_layer.o region_layer.o reorg_layer.o tree.o lstm_layer.o l2norm_layer.o yolo_layer.o
EXECOBJA=captcha.o lsd.o super.o art.o tag.o cifar.o go.o rnn.o segmenter.o regressor.o classifier.o coco.o yolo.o detector.o nightmare.o darknet.o
ifeq ($(GPU), 1)
LDFLAGS+= -lstdc++
OBJ+=convolutional_kernels.o deconvolutional_kernels.o activation_kernels.o im2col_kernels.o col2im_kernels.o blas_kernels.o crop_layer_kernels.o dropout_layer_kernels.o maxpool_layer_kernels.o avgpool_layer_kernels.o
endif
EXECOBJ = $(addprefix $(OBJDIR), $(EXECOBJA))
OBJS = $(addprefix $(OBJDIR), $(OBJ))
DEPS = $(wildcard src/*.h) Makefile include/darknet.h
#all: obj backup results $(SLIB) $(ALIB) $(EXEC)
all: obj results $(SLIB) $(ALIB) $(EXEC)
$(EXEC): $(EXECOBJ) $(ALIB)
$(CC) $(COMMON) $(CFLAGS) $^ -o [email protected] $(LDFLAGS) $(ALIB)
$(ALIB): $(OBJS)
$(AR) $(ARFLAGS) [email protected] $^
$(SLIB): $(OBJS)
$(CC) $(CFLAGS) -shared $^ -o [email protected] $(LDFLAGS)
$(OBJDIR)%.o: %.c $(DEPS)
$(CC) $(COMMON) $(CFLAGS) -c $< -o [email protected]
$(OBJDIR)%.o: %.cu $(DEPS)
$(NVCC) $(Arch) $(COMMON) --compiler-options "$(CFLAGS)" -c $< -o [email protected]
obj:
mkdir -p obj
backup:
mkdir -p backup
results:
mkdir -p results
.PHONY: clean
clean:
rm -rf $(OBJS) $(SLIB) $(ALIB) $(EXEC) $(EXECOBJ) $(OBJDIR)
Und was ist die Lösung für diesen Fehler? Wie kann ich die C++ 11-Unterstützung aktivieren?
Danke für deine Hilfe !
Ich habe das Problem gelöst.
Deinstalliere opencv vollständig.
Laden Sie OpenCV Version 3.4.0 https://github.com/opencv/opencv/releases/tag/3.4.0 und nicht 3.4.1 herunter
Bei Cmake-gui (oder nicht) ist ENABLE_CXX11 = 1
make -j4
neu kompilieren, make install
, Sudo ldconfig
installieren und schließlich funktioniert es!
Fazit: Verwenden Sie niemals die letzte Version von irgendetwas
Nun, Sie müssen OpenCV nicht deinstallieren und erneut installieren. __ Fügen Sie einfach -std = c ++ 11 in Ihre Compile-Zeile ein. __ Angenommen, Ihre Datei ist main und Sie möchten, dass die Objektdatei ausgegeben wird .
g++ -std=c++11 main.cpp -o output `pkg-config --cflags --libs opencv`
Um die Ausgabe anzuzeigen, geben Sie -> ein
./output
Nein, Sie setzen dieses C++ 11-Flag nicht, das Cmake-Skript überprüft dies und der Fehler kommt von here . Das bedeutet, dass Sie höchstwahrscheinlich eine alte gcc-Version verwenden. Testen Sie das mit diesem g++ -dM -E -x c++ -std=c++11 /dev/null | grep plus
und Sie sollten #define __cplusplus 201103L
sehen, wenn nicht, müssen Sie eine neuere Version von gcc installieren.
Im selben Fall habe ich versucht, OpenCv 4.0.0 zu kompilieren und habe unzählige Fehler und Warnungen erhalten. Ohne Grund auf 3.0 umgestellt, aber alles hat perfekt funktioniert. Ich habe gerade Version 3.4.0 ausprobiert und alles funktionierte mit -D ENABLE_CXX=1
Flag.
cd to_working_dir
mingw32-make -j 8 -D ENABLE_CXX=1
# für 3.4 oder höher.
Sie benötigen kein Flag für 3.0. Es funktioniert einfach mit
mingw32-make
** Hinweis: Dies wird nur unter Windows 10 mit mingw getestet. **