GPU coder linking error using cmake on the Jetson nano
8 views (last 30 days)
Show older comments
Hi, I followed the reference tutorial of the MATLAB:
to deploy the generated GPU code about the deep learning network on my Jetson nano Target
I want to use the cmake to build the program in the target directly because we installed a new-version opencv . I got the linking error as follows:
CMakeFiles/main.dir/main_generated_DeepLearningNetwork.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_00006eb6_00000000-5_DeepLearningNetwork.cudafe1.stub.c:14: undefined reference to `__cudaRegisterLinkedBinary_54_tmpxft_00006eb6_00000000_6_DeepLearningNetwork_cpp1_ii_3c015049'
CMakeFiles/main.dir/main_generated_MWCNNLayerImpl.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_00006ee8_00000000-5_MWCNNLayerImpl.cudafe1.stub.c:2: undefined reference to `__cudaRegisterLinkedBinary_49_tmpxft_00006ee8_00000000_6_MWCNNLayerImpl_cpp1_ii_74f5c547'
CMakeFiles/main.dir/main_generated_MWConvLayerImpl.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_00006f22_00000000-5_MWConvLayerImpl.cudafe1.stub.c:14: undefined reference to `__cudaRegisterLinkedBinary_50_tmpxft_00006f22_00000000_6_MWConvLayerImpl_cpp1_ii_050be33a'
CMakeFiles/main.dir/main_generated_MWCudaDimUtility.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_00006f57_00000000-5_MWCudaDimUtility.cudafe1.stub.c:14: undefined reference to `__cudaRegisterLinkedBinary_51_tmpxft_00006f57_00000000_6_MWCudaDimUtility_cpp1_ii_dd421695'
CMakeFiles/main.dir/main_generated_MWElementwiseAffineLayerImpl.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_00006f87_00000000-5_MWElementwiseAffineLayerImpl.cudafe1.stub.c:14: undefined reference to `__cudaRegisterLinkedBinary_63_tmpxft_00006f87_00000000_6_MWElementwiseAffineLayerImpl_cpp1_ii_af034ff7'
CMakeFiles/main.dir/main_generated_MWElementwiseAffineLayerImplKernel.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_00006fb7_00000000-5_MWElementwiseAffineLayerImplKernel.cudafe1.stub.c:2: undefined reference to `__cudaRegisterLinkedBinary_69_tmpxft_00006fb7_00000000_6_MWElementwiseAffineLayerImplKernel_cpp1_ii_3f82fa1c'
CMakeFiles/main.dir/main_generated_MWFusedConvReLULayerImpl.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_00006fe6_00000000-5_MWFusedConvReLULayerImpl.cudafe1.stub.c:14: undefined reference to `__cudaRegisterLinkedBinary_59_tmpxft_00006fe6_00000000_6_MWFusedConvReLULayerImpl_cpp1_ii_5beca28b'
CMakeFiles/main.dir/main_generated_MWTargetNetworkImpl.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_0000701a_00000000-5_MWTargetNetworkImpl.cudafe1.stub.c:14: undefined reference to `__cudaRegisterLinkedBinary_54_tmpxft_0000701a_00000000_6_MWTargetNetworkImpl_cpp1_ii_d94959f5'
CMakeFiles/main.dir/main_generated_main_resnet50.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_0000704b_00000000-5_main_resnet50.cudafe1.stub.c:14: undefined reference to `__cudaRegisterLinkedBinary_48_tmpxft_0000704b_00000000_6_main_resnet50_cpp1_ii_642e5a7f'
CMakeFiles/main.dir/main_generated_predict.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_000070b2_00000000-5_predict.cudafe1.stub.c:2: undefined reference to `__cudaRegisterLinkedBinary_42_tmpxft_000070b2_00000000_6_predict_cpp1_ii_d9cb4df2'
CMakeFiles/main.dir/main_generated_resnet50_wrapper.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_000070e5_00000000-5_resnet50_wrapper.cudafe1.stub.c:14: undefined reference to `__cudaRegisterLinkedBinary_51_tmpxft_000070e5_00000000_6_resnet50_wrapper_cpp1_ii_47a35ee0'
CMakeFiles/main.dir/main_generated_resnet50_wrapper_data.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_00007114_00000000-5_resnet50_wrapper_data.cudafe1.stub.c:14: undefined reference to `__cudaRegisterLinkedBinary_56_tmpxft_00007114_00000000_6_resnet50_wrapper_data_cpp1_ii_212c154c'
CMakeFiles/main.dir/main_generated_resnet50_wrapper_initialize.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_00007147_00000000-5_resnet50_wrapper_initialize.cudafe1.stub.c:14: undefined reference to `__cudaRegisterLinkedBinary_62_tmpxft_00007147_00000000_6_resnet50_wrapper_initialize_cpp1_ii_82f5913d'
CMakeFiles/main.dir/main_generated_resnet50_wrapper_rtwutil.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_0000717e_00000000-5_resnet50_wrapper_rtwutil.cudafe1.stub.c:14: undefined reference to `__cudaRegisterLinkedBinary_59_tmpxft_0000717e_00000000_6_resnet50_wrapper_rtwutil_cpp1_ii_aa3d490c'
CMakeFiles/main.dir/main_generated_resnet50_wrapper_terminate.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_00006e86_00000000-5_resnet50_wrapper_terminate.cudafe1.stub.c:14: undefined reference to `__cudaRegisterLinkedBinary_61_tmpxft_00006e86_00000000_6_resnet50_wrapper_terminate_cpp1_ii_5d082191'
collect2: error: ld returned 1 exit status
CMakeFiles/main.dir/build.make:4187: recipe for target 'main' failed
make[2]: *** [main] Error 1
CMakeFiles/Makefile2:75: recipe for target 'CMakeFiles/main.dir/all' failed
make[1]: *** [CMakeFiles/main.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
CMake Error at main_generated_predict.cu.o.cmake:280 (message):
Error generating file
/home/zqax/remoteBuildDir333/MATLAB_ws/R2020a/D/MATLAB/nvidia_gettingstarted/codegen/exe/resnet50_wrapper/CMakeFiles/main.dir/././main_generated_predict.cu.o
make[2]: *** [CMakeFiles/main.dir/main_generated_predict.cu.o] Error 1
CMakeFiles/Makefile2:75: recipe for target 'CMakeFiles/main.dir/all' failed
make[1]: *** [CMakeFiles/main.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
Here is my cmakelist.txt, I put all files in the same folder:
# cmake needs this line
cmake_minimum_required(VERSION 3.1)
# Enable C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
project(Test)
set(CUDA_USE_STATIC_CUDA_RUNTIME ON)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
find_package(CUDA REQUIRED)
message(STATUS "CUDA library status:")
message(STATUS " version: ${CUDA_VERSION}")
message(STATUS " include path: ${CUDA_INCLUDE_DIRS}")
message(STATUS " libraries: ${CUDA_LIBRARIES}")
set(CUDA_NVCC_FLAGS -O3;--relocatable-device-code=true; -gencode arch=compute_53,code=sm_53; -x cu) # nvcc flags
include_directories(${CUDA_INCLUDE_DIRS})
include_directories(/usr/local/cuda/samples/common/inc)
include_directories(/usr/lib/aarch64-linux-gnu)
include_directories(/usr/local/cuda/lib64)
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV library status:")
message(STATUS " config: ${OpenCV_DIR}")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " libraries: ${OpenCV_LIBS}")
message(STATUS " include path: ${OpenCV_INCLUDE_DIRS}")
AUX_SOURCE_DIRECTORY(. SRC_LIST)
MESSAGE(STATUS "The files need to be built: ${SRC_LIST} \n" )
#cuda_add_library(lib ${SRC_LIST})
CUDA_ADD_EXECUTABLE(main ${SRC_LIST})
target_link_libraries(main ${OpenCV_LIBS} ${CUDA_LIBRARIES} cudnn cublas)
Thanks!
Yuhao
Answers (2)
Ramakrishna Mandalapu
on 24 Apr 2020
Edited: Ramakrishna Mandalapu
on 24 Apr 2020
Hi Yuhao,
If you want to use the custom OpenCV installed in the different location on the target then you can use the "coder.updateBuildInfo" API to link that.
For example if the OpenCV is installed at "/home/ubuntu/opencv_for_tegra/install" then you can use the above API to use the OpenCV in this folder like below. The below lines of code should be added in the design function at the begining (e.g resnet50_wrapper).
function out = resnet50_wrapper(im) %#codegen
% Wrapper function to call ResNet50 predict function.
% Copyright 2019 The MathWorks, Inc.
flags = '-lopencv_dnn -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core';
includePath = '/home/ubuntu/opencv_for_tegra/install/include';
opencv_link_flags = ['-L/home/ubuntu/opencv_for_tegra/install/lib ' flags];
coder.updateBuildInfo('addLinkFlags',opencv_link_flags);
coder.updateBuildInfo('addIncludePaths',includePath);
%
% Some code
%
%
end
In the above line,
includePath - specifies the location of the includes of the custom opencv
opencv_link_flags - Specifies the location of the shared libs and the required libs to use.
Modify the above custom OpenCV locations according to your need and try generating the code (using codegen) then it will generate a makefile which contains the above OpenCV information for building the code.
On the board, you need to export the OpenCV shared libraries path (like below) to successfully run the executable.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ubuntu/opencv_for_tegra/install/lib
If you use the above workflow then you don't need use the CMake for building. The codegen will take care of generating the appropriate Makefile and building the code on the target. You just need to specify which DeepLearning library to use (cuDNN or TensorRT) in the coder config.
Thanks,
Ramakrishna
3 Comments
Ramakrishna Mandalapu
on 29 Apr 2020
Hi Yuhao,
Please check webcam availability on the target, in the main file provided with the example we use camera device 1 (/dev/video1). The camera may be mising on the board.
$ ls /dev/video*
default camera (/dev/video0) can't be used since it uses different interface.
-Ramakrishna
See Also
Categories
Find more on Code Generation, GPU, and Third-Party Support in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!