wake-up-neo.net

Für OpenCV 4.x + ist ein schwerwiegender Darknet-Fehler in C++ 11 erforderlich

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 !

4
FlavienRJ

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

3
FlavienRJ

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
3
KnightRider

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.

3
fireant

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. **

0
Mujeeb I.