How to link to OepnCV lib in TensorRT project MakeFile

I like to link one project to OpenCV in the MakeFile.

Say this is MakeFile for one project and how to link to OpenCV in that MakeFile?

OUTNAME_RELEASE = sample_uff_faster_rcnn
OUTNAME_DEBUG   = sample_uff_faster_rcnn_debug
EXTRA_DIRECTORIES = ../common
MAKEFILE ?= ../Makefile.config
include $(MAKEFILE)

Please refer to below topic:

Thanks

I have added OpenCV’s include folder ( -I"/usr/local/include/opencv2" -I"/usr/local/include/opencv" ) and lib folder ( -L"/usr/local/lib" ) in INCPATHS and LIBPATHS .

    INCPATHS += -I"../common" -I"$(CUDA_INSTALL_DIR)/include" -I"$(CUDNN_INSTALL_DIR)/include" -I"../include" -I"../../include" -I"/usr/local/include/opencv2" -I"/usr/local/include/opencv"
    LIBPATHS += -L"$(CUDA_INSTALL_DIR)/$(CUDA_LIBDIR)" -L"$(CUDNN_INSTALL_DIR)/$(CUDNN_LIBDIR)" -L"../lib" -L"../../lib"   -L"/usr/local/lib"

Opencv libraries are added in

`COMMON_LIBS += -lrt -ldl -lpthread -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab`

But I have error as

make[1]: Entering directory '/home/itc/TensorRT/TensorRT-7.0.0.11/samples/sampleCharRNN'
../Makefile.config:7: CUDA_INSTALL_DIR variable is not specified, using /usr/local/cuda by default, use CUDA_INSTALL_DIR=<cuda_directory> to change.
../Makefile.config:10: CUDNN_INSTALL_DIR variable is not specified, using $CUDA_INSTALL_DIR by default, use CUDNN_INSTALL_DIR=<cudnn_directory> to change.
Linking: ../../bin/sample_char_rnn_debug
g++ -o ../../bin/sample_char_rnn_debug ../../bin/dchobj/sampleCharRNN.o ../../bin/dchobj/../common/sampleInference.o ../../bin/dchobj/../common/sampleOptions.o ../../bin/dchobj/../common/logger.o ../../bin/dchobj/../common/getOptions.o ../../bin/dchobj/../common/sampleReporting.o ../../bin/dchobj/../common/sampleEngines.o  -L"/usr/local/cuda/lib64" -L"/usr/local/cuda/lib64" -L"../lib" -L"../../lib"   -L"/usr/local/lib" -L../../bin   -Wl,--start-group -lnvinfer -lnvparsers -lnvinfer_plugin -lnvonnxparser -lcudnn -lcublas -lcudart -lrt -ldl -lpthread -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab -lmyelin -lnvrtc -Wl,--end-group
/usr/bin/ld: cannot find -lopencv_contrib
/usr/bin/ld: cannot find -lopencv_gpu
/usr/bin/ld: cannot find -lopencv_legacy
/usr/bin/ld: cannot find -lopencv_nonfree
/usr/bin/ld: cannot find -lopencv_ocl
/usr/bin/ld: cannot find -lopencv_ts
collect2: error: ld returned 1 exit status
../Makefile.config:175: recipe for target '../../bin/sample_char_rnn_debug' failed
make[1]: *** [../../bin/sample_char_rnn_debug] Error 1
make[1]: Leaving directory '/home/itc/TensorRT/TensorRT-7.0.0.11/samples/sampleCharRNN'
Makefile:56: recipe for target 'all' failed
make: *** [all] Error 2

How to link to OpenCV? The whole makefile.config is as follow. How to solve?

.SUFFIXES:
    CUDA_TRIPLE?=x86_64-linux
    CUBLAS_TRIPLE?=x86_64-linux-gnu
    DLSW_TRIPLE?=x86_64-linux-gnu
    TARGET?=$(shell uname -m)
    ifeq ($(CUDA_INSTALL_DIR),)
    $(warning CUDA_INSTALL_DIR variable is not specified, using /usr/local/cuda by default, use CUDA_INSTALL_DIR=<cuda_directory> to change.)
    endif
    ifeq ($(CUDNN_INSTALL_DIR),)
    $(warning CUDNN_INSTALL_DIR variable is not specified, using $CUDA_INSTALL_DIR by default, use CUDNN_INSTALL_DIR=<cudnn_directory> to change.)
    endif
    CUDA_INSTALL_DIR?=/usr/local/cuda
    CUDNN_INSTALL_DIR?=$(CUDA_INSTALL_DIR)
    CUDA_LIBDIR=lib
    CUDNN_LIBDIR=lib64
    ifeq ($(TARGET), aarch64)
    ifeq ($(shell uname -m), aarch64)
    CUDA_LIBDIR=lib64
    CC = g++
    else
    CC = aarch64-linux-gnu-g++
    endif
    CUCC =$(CUDA_INSTALL_DIR)/bin/nvcc -m64 -ccbin $(CC)
    else ifeq ($(TARGET), x86_64)
    CUDA_LIBDIR=lib64
    CC = g++
    CUCC =$(CUDA_INSTALL_DIR)/bin/nvcc -m64
    else ifeq ($(TARGET), ppc64le)
    CUDA_LIBDIR=lib64
    CC = g++
    CUCC = $(CUDA_INSTALL_DIR)/bin/nvcc -m64
    else ifeq ($(TARGET), qnx)
    CC = ${QNX_HOST}/usr/bin/aarch64-unknown-nto-qnx7.0.0-g++
    CUCC = $(CUDA_INSTALL_DIR)/bin/nvcc -m64 -ccbin $(CC)
    else ifeq ($(TARGET), android64)
    ifeq ($(ANDROID_CC),)
    $(error ANDROID_CC must be set to the clang compiler to build for android 64bit, for example /path/to/my-toolchain/bin/aarch64-linux-android-clang++)
    endif
    CUDA_LIBDIR=lib
    ANDROID_FLAGS=-DANDROID -D_GLIBCXX_USE_C99=1 -Wno-sign-compare -D__aarch64__ -Wno-strict-aliasing -Werror -pie -fPIE -Wno-unused-command-line-argument
    COMMON_FLAGS+=$(ANDROID_FLAGS)
    COMMON_LD_FLAGS+=$(ANDROID_FLAGS)
    CC=$(ANDROID_CC)
    CUCC = $(CUDA_INSTALL_DIR)/bin/nvcc -m64 -ccbin $(CC) --compiler-options="-DANDROID -D_GLIBCXX_USE_C99=1 -Wno-sign-compare"
    ANDROID=1
    else ########
    $(error Auto-detection of platform failed. Please specify one of the following arguments to make: TARGET=[aarch64|x86_64|qnx|android64])
    endif

    ifdef VERBOSE
    AT=
    else
    AT=@
    endif

    AR = ar cr
    ECHO = @echo

    SHELL=/bin/sh

    ROOT_PATH=../..
    OUT_PATH=$(ROOT_PATH)/bin
    OUTDIR=$(OUT_PATH)

    define concat
    $1$2$3$4$5$6$7$8
    endef

    #$(call make-depend,source-file,object-file,depend-file)
    define make-depend
      $(AT)$(CC) -MM -MF $3 -MP -MT $2 $(COMMON_FLAGS) $1
    endef

    #$(call make-cuda-depend,source-file,object-file,depend-file,flags)
    define make-cuda-depend
      $(AT)$(CUCC) -M -MT $2 $4 $1 > $3
    endef

    INCPATHS=
    LIBPATHS=
    # add cross compile directories
    ifneq ($(shell uname -m), $(TARGET))
    INCPATHS += -I"/usr/include/$(DLSW_TRIPLE)" -I"/usr/include/$(CUBLAS_TRIPLE)"
    LIBPATHS += -L"../lib/stubs" -L"../../lib/stubs" -L"/usr/lib/$(DLSW_TRIPLE)/stubs" -L"/usr/lib/$(DLSW_TRIPLE)" -L"/usr/lib/$(CUBLAS_TRIPLE)/stubs" -L"/usr/lib/$(CUBLAS_TRIPLE)" -L"$(CUDA_INSTALL_DIR)/targets/$(CUDA_TRIPLE)/$(CUDA_LIBDIR)/stubs" -L"$(CUDA_INSTALL_DIR)/targets/$(CUDA_TRIPLE)/$(CUDA_LIBDIR)"
    endif
    INCPATHS += -I"../common" -I"$(CUDA_INSTALL_DIR)/include" -I"$(CUDNN_INSTALL_DIR)/include" -I"../include" -I"../../include" -I"/usr/local/include/opencv2" -I"/usr/local/include/opencv"
    LIBPATHS += -L"$(CUDA_INSTALL_DIR)/$(CUDA_LIBDIR)" -L"$(CUDNN_INSTALL_DIR)/$(CUDNN_LIBDIR)" -L"../lib" -L"../../lib"   -L"/usr/local/lib"

    .SUFFIXES:
    vpath %.h $(EXTRA_DIRECTORIES)
    vpath %.cpp $(EXTRA_DIRECTORIES)

    COMMON_FLAGS += -Wall -Wno-deprecated-declarations -std=c++11 $(INCPATHS) 
    ifneq ($(ANDROID),1)
    COMMON_FLAGS += -D_REENTRANT
    endif
    ifeq ($(TARGET), qnx)
    COMMON_FLAGS += -D_POSIX_C_SOURCE=200112L -D_QNX_SOURCE -D_FILE_OFFSET_BITS=64 -fpermissive
    endif

    COMMON_LD_FLAGS += $(LIBPATHS) -L$(OUTDIR) 

    OBJDIR    =$(call concat,$(OUTDIR),/chobj)
    DOBJDIR   =$(call concat,$(OUTDIR),/dchobj)

    COMMON_LIBS = -lcudnn -lcublas -lcudart

    ifneq ($(TARGET), qnx)
    ifneq ($(ANDROID),1)
    COMMON_LIBS += -lrt -ldl -lpthread -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab
    endif
    endif
    ifeq ($(ANDROID),1)
    COMMON_LIBS += -lculibos -llog
    endif

    ENABLE_MYELIN := 0
    ifeq ($(TARGET), x86_64)
    ifeq ($(CUDA), $(filter $(CUDA),cuda-9.0 cuda-10.0 cuda-10.2))
    ENABLE_MYELIN = 1
    endif
    else ifeq ($(TARGET), ppc64le)
    ifeq ($(CUDA), $(filter $(CUDA), cuda-10.2))
    ENABLE_MYELIN = 1
    endif
    endif

    ifeq ($(ENABLE_MYELIN), 1)
    COMMON_LIBS += -lmyelin -lnvrtc
    endif

    LIBS  =-lnvinfer -lnvparsers -lnvinfer_plugin -lnvonnxparser $(COMMON_LIBS) 
    DLIBS =-lnvinfer -lnvparsers -lnvinfer_plugin -lnvonnxparser $(COMMON_LIBS)
    OBJS   =$(patsubst %.cpp, $(OBJDIR)/%.o, $(wildcard *.cpp $(addsuffix /*.cpp, $(EXTRA_DIRECTORIES))))
    DOBJS  =$(patsubst %.cpp, $(DOBJDIR)/%.o, $(wildcard *.cpp $(addsuffix  /*.cpp, $(EXTRA_DIRECTORIES))))
    CUOBJS =$(patsubst %.cu, $(OBJDIR)/%.o, $(wildcard *.cu $(addsuffix  /*.cu, $(EXTRA_DIRECTORIES))))
    CUDOBJS =$(patsubst %.cu, $(DOBJDIR)/%.o, $(wildcard *.cu $(addsuffix  /*.cu, $(EXTRA_DIRECTORIES))))

    CFLAGS=$(COMMON_FLAGS) $(OPCVCFLAGS)
    CFLAGSD=$(COMMON_FLAGS) -g
    LFLAGS=$(COMMON_LD_FLAGS)
    LFLAGSD=$(COMMON_LD_FLAGS) 

    all: debug release
    release : $(OUTDIR)/$(OUTNAME_RELEASE)

    debug   : $(OUTDIR)/$(OUTNAME_DEBUG)

    test: test_debug test_release

    test_debug:
        $(AT)cd $(OUTDIR) && ./$(OUTNAME_DEBUG)

    test_release:
        $(AT)cd $(OUTDIR) && ./$(OUTNAME_RELEASE)

    ifdef MAC
    $(OUTDIR)/$(OUTNAME_RELEASE) : $(OBJS) $(CUOBJS)
        $(ECHO) Linking: $@
        $(AT)$(CC) -o $@ $^ $(LFLAGS) $(LIBS)
        # Copy every EXTRA_FILE of this sample to bin dir
        $(foreach EXTRA_FILE,$(EXTRA_FILES), cp -f $(EXTRA_FILE) $(OUTDIR)/$(EXTRA_FILE); )

    $(OUTDIR)/$(OUTNAME_DEBUG) : $(DOBJS) $(CUDOBJS)
        $(ECHO) Linking: $@
        $(AT)$(CC) -o $@ $^ $(LFLAGSD) $(DLIBS)
    else
    $(OUTDIR)/$(OUTNAME_RELEASE) : $(OBJS) $(CUOBJS)
        $(ECHO) Linking: $@
        $(AT)$(CC) -o $@ $^ $(LFLAGS)  -Wl,--start-group $(LIBS) -Wl,--end-group
        # Copy every EXTRA_FILE of this sample to bin dir
        $(foreach EXTRA_FILE,$(EXTRA_FILES), cp -f $(EXTRA_FILE) $(OUTDIR)/$(EXTRA_FILE); )

    $(OUTDIR)/$(OUTNAME_DEBUG) : $(DOBJS) $(CUDOBJS)
        $(ECHO) Linking: $@
        $(AT)$(CC) -o $@ $^ $(LFLAGSD) -Wl,--start-group $(DLIBS) -Wl,--end-group
    endif

    $(OBJDIR)/%.o: %.cpp
        $(AT)if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi
        $(foreach XDIR,$(EXTRA_DIRECTORIES), if [ ! -d $(OBJDIR)/$(XDIR) ]; then mkdir -p $(OBJDIR)/$(XDIR); fi;) :
        $(call make-depend,$<,$@,$(subst .o,.d,$@))
        $(ECHO) Compiling: $<
        $(AT)$(CC) $(CFLAGS) -c -o $@ $<

    $(DOBJDIR)/%.o: %.cpp
        $(AT)if [ ! -d $(DOBJDIR) ]; then mkdir -p $(DOBJDIR); fi
        $(foreach XDIR,$(EXTRA_DIRECTORIES), if [ ! -d $(OBJDIR)/$(XDIR) ]; then mkdir -p $(DOBJDIR)/$(XDIR); fi;) :
        $(call make-depend,$<,$@,$(subst .o,.d,$@))
        $(ECHO) Compiling: $<
        $(AT)$(CC) $(CFLAGSD) -c -o $@ $<

    ######################################################################### 
    $(OBJDIR)/%.o: %.cu
        $(AT)if [ ! -d $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi
        $(foreach XDIR,$(EXTRA_DIRECTORIES), if [ ! -d $(OBJDIR)/$(XDIR) ]; then mkdir -p $(OBJDIR)/$(XDIR); fi;) :
        $(call make-cuda-depend,$<,$@,$(subst .o,.d,$@))
        $(ECHO) Compiling CUDA release: $<
        $(AT)$(CUCC) $(CUFLAGS) -c -o $@ $<

    $(DOBJDIR)/%.o: %.cu
        $(AT)if [ ! -d $(DOBJDIR) ]; then mkdir -p $(DOBJDIR); fi
        $(foreach XDIR,$(EXTRA_DIRECTORIES), if [ ! -d $(DOBJDIR)/$(XDIR) ]; then mkdir -p $(DOBJDIR)/$(XDIR); fi;) :
        $(call make-cuda-depend,$<,$@,$(subst .o,.d,$@))
        $(ECHO) Compiling CUDA debug: $<
        $(AT)$(CUCC) $(CUFLAGSD) -c -o $@ $<

    clean:
        $(ECHO) Cleaning...
        $(AT)-rm -rf $(OBJDIR) $(DOBJDIR) $(OUTDIR)/$(OUTNAME_RELEASE) $(OUTDIR)/$(OUTNAME_DEBUG)
        $(foreach XDIR,$(EXTRA_DIRECTORIES), if [ -d $(OBJDIR)/$(XDIR) ]; then rm -rf $(OBJDIR)/$(XDIR); fi;) :
        $(foreach XDIR,$(EXTRA_DIRECTORIES), if [ -d $(DOBJDIR)/$(XDIR) ]; then rm -rf $(DOBJDIR)/$(XDIR); fi;) :

    ifneq "$(MAKECMDGOALS)" "clean"
        -include $(OBJDIR)/*.d $(DOBJDIR)/*.d

    ifeq ($(DO_CUDNN_CHECK), 1)
    # To display newlines in the message.
    define _cudnn_missing_newline_5020fd0


    endef
    SHELL=/bin/bash
    CUDNN_CHECK = $(shell echo -e '\#include <cudnn.h>\nint main(){ cudnnCreate(nullptr); return 0; }' | $(CC) -xc++ -o /dev/null $(CFLAGS) $(LFLAGS) - $(COMMON_LIBS) 2> /dev/null && echo 'passed_cudnn_exists_check')
    ifneq ($(CUDNN_CHECK), passed_cudnn_exists_check)
    $(error $(_cudnn_missing_newline_5020fd0)$(_cudnn_missing_newline_5020fd0)This sample requires CUDNN, but it could not be found.$(_cudnn_missing_newline_5020fd0)Please install CUDNN from https://developer.nvidia.com/cudnn or specify CUDNN_INSTALL_DIR when compiling.$(_cudnn_missing_newline_5020fd0)For example, `make CUDNN_INSTALL_DIR=/path/to/CUDNN/` where /path/to/CUDNN/ contains include/ and lib/ subdirectories.$(_cudnn_missing_newline_5020fd0)$(_cudnn_missing_newline_5020fd0))
    endif # ifneq ($(CUDNN_CHECK), passed_cudnn_exists_check)
    endif # ifeq ($(DO_CUDNN_CHECK), 1)
    endif # ifneq "$(MAKECMDGOALS)" "clean"

It seems OpenCV lib dir is not added in LIBPATHS.
Please refer to below sample that i found on web:

You can also try to include the path of your opencv’s .so files in LD_LIBRARY_PATH ()

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/opencv/lib

Thanks