Cross-compiling error while using OpenCV in sample_camera application

Hi @VickNV , I’m able to resolve the library issue by following this guide - OpenCV: Cross compilation for ARM based Linux systems

lidar@nvidia-drive:~/opencv_aarch64/opencv/platforms/linux/build_hardfp$ cmake -DCMAKE_TOOLCHAIN_FILE=../aarch64-gnu.toolchain.cmake ../../..
.....
.....
lidar@nvidia-drive:~/opencv_aarch64/opencv/platforms/linux/build_hardfp$ make -j32
....
....
[ 99%] Built target opencv_perf_gapi
[100%] Building CXX object modules/gapi/CMakeFiles/opencv_test_gapi.dir/test/util/variant_tests.cpp.o
[100%] Linking CXX executable ../../bin/opencv_test_gapi
[100%] Built target opencv_test_gapi

lidar@nvidia-drive:~/opencv_aarch64/opencv/platforms/linux/build_hardfp$ file /home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_core.so.4.6.0
/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_core.so.4.6.0: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=06e3d678873383f824e0145835eb538a624493a5, not stripped

Now I tried rebuilding but there are still few undefined reference errors:

/home/lidar/Documents/Nvidia_Drive/DRIVE_OS_5.2.0_SDK_Linux_OS_DRIVE_AGX_XAVIER/DRIVEOS/drive-t186ref-linux/targetfs/lib/aarch64-linux-gnu/libc-2.27.so: undefined reference to `_dl_exception_create@GLIBC_PRIVATE'
/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_dnn.so.4.6.0: undefined reference to `powf@GLIBC_2.27'
/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_dnn.so.4.6.0: undefined reference to `expf@GLIBC_2.27'
/home/lidar/Documents/Nvidia_Drive/DRIVE_OS_5.2.0_SDK_Linux_OS_DRIVE_AGX_XAVIER/DRIVEOS/drive-t186ref-linux/targetfs/lib/aarch64-linux-gnu/libc-2.27.so: undefined reference to `__tunable_get_val@GLIBC_PRIVATE'
/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_video.so.4.6.0: undefined reference to `log2f@GLIBC_2.27'
/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_core.so.4.6.0: undefined reference to `logf@GLIBC_2.27'
collect2: error: ld returned 1 exit status

CMakeLists of Camera:

project(sample_camera C CXX)
find_library(TACOPIE_LIBRARY tacopie)
#-------------------------------------------------------------------------------
# Project files
#-------------------------------------------------------------------------------
set(PUBLIC_DOCS
    README.md
)

set(SOURCES
    main.cpp
)

set(LIBRARIES
    ${Driveworks_LIBRARIES}
    samples_framework
    lodepng-src
)

#-------------------------------------------------------------------------------
# Final target
#-------------------------------------------------------------------------------
link_directories("/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/")

add_executable(${PROJECT_NAME} ${SOURCES})
target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBRARIES}
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_core.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_calib3d.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_dnn.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_features2d.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_flann.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_gapi.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_highgui.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_imgcodecs.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_imgproc.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_ml.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_objdetect.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_photo.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_stitching.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_video.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_videoio.so.4.6.0"
"/home/lidar/Documents/Nvidia_Drive/DRIVE_OS_5.2.0_SDK_Linux_OS_DRIVE_AGX_XAVIER/DRIVEOS/drive-t186ref-linux/targetfs/lib/aarch64-linux-gnu/libc-2.27.so"
${TACOPIE_LIBRARY}
)
set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER "Samples")

# ------------------------------------------------------------------------------
# Install target
# ------------------------------------------------------------------------------
sdk_add_sample(${PROJECT_NAME})
sdk_add_sample_data(${PROJECT_NAME} "samples/sensors/camera/camera")

Please let me know what should I include in CMakeLists to resolve the undefined reference errors.

Also one more question, I have been using CPP_REDIS for sending camera frames in-memory to another process but again cross compilation issue is there so any other alternative to achieve this? Can ROS be a feasible option?

Inlcuding OpenCV in DriveWorks is still throwing the below linker errors.
Could please advice on how to resolve them:

/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_dnn.so.4.6.0: undefined reference to `powf@GLIBC_2.27'
/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_dnn.so.4.6.0: undefined reference to `expf@GLIBC_2.27'
/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_video.so.4.6.0: undefined reference to `log2f@GLIBC_2.27'
/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_core.so.4.6.0: undefined reference to `logf@GLIBC_2.27'

CMakeList

project(sample_camera C CXX)
#-------------------------------------------------------------------------------
# Project files
#-------------------------------------------------------------------------------
set(PUBLIC_DOCS
    README.md
)

set(SOURCES
    main.cpp
)

set(LIBRARIES
    ${Driveworks_LIBRARIES}
    samples_framework
    lodepng-src
)

#-------------------------------------------------------------------------------
# Final target
#-------------------------------------------------------------------------------
#link_directories("/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/")

add_executable(${PROJECT_NAME} ${SOURCES})

target_link_libraries(${PROJECT_NAME} PRIVATE ${LIBRARIES}
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_core.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_calib3d.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_dnn.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_features2d.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_flann.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_gapi.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_highgui.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_imgcodecs.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_imgproc.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_ml.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_objdetect.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_photo.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_stitching.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_video.so.4.6.0"
"/home/lidar/opencv_aarch64/opencv/platforms/linux/build_hardfp/lib/libopencv_videoio.so.4.6.0"
)

set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER "Samples")

# ------------------------------------------------------------------------------
# Install target
# ------------------------------------------------------------------------------
sdk_add_sample(${PROJECT_NAME})
sdk_add_sample_data(${PROJECT_NAME} "samples/sensors/camera/camera")

GLibc version:

lidar@nvidia-drive:~/Documents/Nvidia_Drive/buildCrossCompile$ ldd --version
ldd (Ubuntu GLIBC 2.27-3ubuntu1.5) 2.27
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
lidar@nvidia-drive:~/Documents/Nvidia_Drive/buildCrossCompile$ 

All shared libraries are having undefined reference with one/more the following:

  • `powf@GLIBC_2.27’
  • `expf@GLIBC_2.27’
  • `log2f@GLIBC_2.27’
  • `logf@GLIBC_2.27’

Please help in resolving this error so that OpenCV gets cross-compiled correctly with DriveWorks.

Please see if Meet "undefined reference to `log2f@GLIBC_2.27'" error when using the crosscompile toolchain helps. Thanks.

Hey @VickNV , this discussion Meet "undefined reference to `log2f@GLIBC_2.27'" error when using the crosscompile toolchain doesn’t talk about how to resolve my issue as they are pointing to symbolic links but here in my CMakeLists I have externally given absolute paths to the .so files.
I have never experienced such issues before. Please advice.

Maybe you need to ensure these OpenCV libraries are also compiled by glibc 2.27.

You may be able to solve that library error by adding an environment variable or adding them in .bashrc file

LD_LIBRARY_PATH=/usr/local/lib
export LD_LIBRARY_PATH

@a.sreekumar.515 , thanks for your kind help but in my case this fix didn’t work. I’m still getting the same error.

Dear @VickNV , Could you please provide any reference blog or similar?

I don’t have any reference blog. Please make sure you use the same cross-compiling toolchains (the one below) for both OpenCV and your application.

~/nvidia/nvidia_sdk/DRIVE_OS_5.2.0*/DRIVEOS/toolchains