Undefined reference to NvJPEGEncoder and Cmake

Hello, I am currently trying to use NvJPEG on my project but it fails when compiling giving a Undefined reference error.

[build] FAILED: example 
[build] : && /usr/bin/aarch64-linux-gnu-g++ -g -rdynamic CMakeFiles/example.dir/example.cpp.o -o example -L/usr/local/cuda-10.2/lib64   -L/usr/lib/aarch64-linux-gnu/tegra -Wl,-rpath,/usr/local/cuda-10.2/lib64:/usr/lib/aarch64-linux-gnu/tegra  /usr/lib/aarch64-linux-gnu/libopencv_gapi.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_stitching.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_alphamat.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_aruco.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_barcode.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_bgsegm.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_bioinspired.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_ccalib.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_cudabgsegm.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_cudafeatures2d.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_cudaobjdetect.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_cudastereo.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_dnn_objdetect.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_dnn_superres.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_dpm.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_face.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_freetype.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_fuzzy.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_hdf.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_hfs.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_img_hash.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_intensity_transform.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_line_descriptor.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_mcc.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_quality.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_rapid.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_reg.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_rgbd.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_saliency.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_sfm.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_stereo.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_structured_light.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_superres.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_surface_matching.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_tracking.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_videostab.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_wechat_qrcode.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_xfeatures2d.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_xobjdetect.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_xphoto.so.4.6.0  -lnvjpeg  -lpthread  /usr/lib/aarch64-linux-gnu/libopencv_shape.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_highgui.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_datasets.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_plot.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_text.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_ml.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_phase_unwrapping.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_cudacodec.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_videoio.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_cudaoptflow.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_cudalegacy.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_cudawarping.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_optflow.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_ximgproc.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_video.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_imgcodecs.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_objdetect.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_calib3d.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_dnn.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_features2d.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_flann.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_photo.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_cudaimgproc.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_cudafilters.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_imgproc.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_cudaarithm.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_core.so.4.6.0  /usr/lib/aarch64-linux-gnu/libopencv_cudev.so.4.6.0 && :
[build] CMakeFiles/example.dir/example.cpp.o: In function `main':
[build] /home/user/examples/build/../example.cpp:61: undefined reference to `NvJPEGEncoder::createJPEGEncoder(char const*)'
[build] collect2: error: ld returned 1 exit status
[build] ninja: build stopped: subcommand failed.
[proc] The command: /usr/local/bin/cmake --build /home/user/examples/build --config Debug --target all -- exited with code: 1
[build] Build finished with exit code 1

My CmakeList.txt

cmake_minimum_required(VERSION 3.10)
find_package(OpenCV 4.2 REQUIRED)
find_package(CUDAToolkit)
link_directories(/usr/lib/aarch64-linux-gnu/tegra)

add_executable(example ./example.cpp)

target_include_directories(example PRIVATE /usr/src/jetson_multimedia_api/include)
target_link_libraries(example
    PRIVATE
        ${OpenCV_LIBS} 
		CUDA::toolkit
		nvjpeg

)


Any assistance on this would be very appreciated.

Hi,
Please make sure you build this cpp file also:

/usr/src/jetson_multimedia_api/samples/common/classes/NvJpegEncoder.cpp

I ended building the whole directory as it kept asking for includes.

cmake_minimum_required(VERSION 3.1)

find_package(OpenCV 4.2 REQUIRED)
find_package(CUDAToolkit)
link_directories(/usr/lib/aarch64-linux-gnu/tegra)
set(multimedia_api_path "/usr/src/jetson_multimedia_api")


file(GLOB_RECURSE multimedia_api_src
     "${multimedia_api_path}/samples/common/classes/*.cpp"
)
add_library(multimedia_api_lib ${multimedia_api_src})
target_include_directories(multimedia_api_lib PRIVATE 
${multimedia_api_path}/include
${multimedia_api_path}/include/libjpeg-8b
/usr/include/libdrm
)

add_executable(example ./example-working.cpp )

target_include_directories(example PRIVATE 
/usr/src/jetson_multimedia_api/include
${multimedia_api_path}/include
${multimedia_api_path}/include/libjpeg-8b
)
target_link_libraries(example
    PRIVATE
    multimedia_api_lib
        ${OpenCV_LIBS} 
		-lpthread -lv4l2 -lnvbuf_utils -lnvjpeg -lnvosd -ldrm -lcuda -lcudart
)

I later discovered this is all the .cpp you need to include

set(multimedia_api_src
     "${multimedia_api_path}/samples/common/classes/NvBuffer.cpp"
     "${multimedia_api_path}/samples/common/classes/NvJpegEncoder.cpp"
     "${multimedia_api_path}/samples/common/classes/NvLogging.cpp"
     "${multimedia_api_path}/samples/common/classes/NvUtils.cpp"
     "${multimedia_api_path}/samples/common/classes/NvElement.cpp"
     "${multimedia_api_path}/samples/common/classes/NvElementProfiler.cpp"

)

And also to undefine None and Status on your source code because X11 headers define them as integrers for some reason and could cause conflicts.

[...]
#include <nvbuf_utils.h>
#undef None
#undef Status
[...]
1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.