(一共>2个so库,
libTNN.so需要librknpu_ddk.so,
librknpu_ddk.so需要其他3个so库,
librknpu_ddk.so和其他3个so库放一起, 在文件夹rknpu_ddk_lib64下, 即rknpu_ddk一共4个so库)
测试过程是首先通过以下命令用g++编译工程, 然后进gdb -q test_tnn进行调试
第一种
-L和-l包括rknpu_ddk和TNN, -Wl,-rpath包括rknpu_ddk 4个so库和libTNN.so的目录
编译成功, gdb里面run成功:
/usr/bin/g++ -g *.cpp -g *.cc -o test_tnn -I /home/toybrick/TNN/TNN/include/ -L /home/toybrick/TNN/test_hy/rknpu_ddk_lib64/ -l rknpu_ddk -L /home/toybrick/TNN/TNN/scripts/build_aarch64_linux/ -l TNN -Wl,-rpath /home/toybrick/TNN/test_hy/rknpu_ddk_lib64/ -Wl,-rpath /home/toybrick/TNN/TNN/scripts/build_aarch64_linux/
第二种
-L和-l包括rknpu_ddk和TNN, -Wl,-rpath包括rknpu_ddk 4个so库的目录, 不包括libTNN.so的目录
编译成功, gdb里面run失败,
(报错libTNN.so.0: cannot open shared object file):
/usr/bin/g++ -g *.cpp -g *.cc -o test_tnn -I /home/toybrick/TNN/TNN/include/ -L /home/toybrick/TNN/test_hy/rknpu_ddk_lib64/ -l rknpu_ddk -L /home/toybrick/TNN/TNN/scripts/build_aarch64_linux/ -l TNN -Wl,-rpath /home/toybrick/TNN/test_hy/rknpu_ddk_lib64/
第三种(两个情况)
-L和-l包括和TNN, 不包括rknpu_ddk, -Wl,-rpath包括rknpu_ddk 4个so库和libTNN.so的目录
编译成功, gdb里面run失败,
(报错librknpu_ddk.so: cannot open shared object file):
/usr/bin/g++ -g *.cpp -g *.cc -o test_tnn -I /home/toybrick/TNN/TNN/include/ -L /home/toybrick/TNN/TNN/scripts/build_aarch64_linux/ -l TNN -Wl,-rpath /home/toybrick/TNN/test_hy/rknpu_ddk_lib64/ -Wl,-rpath /home/toybrick/TNN/TNN/scripts/build_aarch64_linux/
-L和-l包括和TNN, 不包括rknpu_ddk, -Wl,-rpath包括rknpu_ddk 4个so库, 不包括libTNN.so的目录
编译成功, gdb里面run失败,
(报错libTNN.so.0: cannot open shared object file):
/usr/bin/g++ -g *.cpp -g *.cc -o test_tnn -I /home/toybrick/TNN/TNN/include/ -L /home/toybrick/TNN/TNN/scripts/build_aarch64_linux/ -l TNN -Wl,-rpath /home/toybrick/TNN/test_hy/rknpu_ddk_lib64/
第四种
-L和-l包括rknpu_ddk和TNN, 不使用-Wl,-rpath
编译失败,
(报错librknpu_ddk.so: undefined reference to xxx):
/usr/bin/g++ -g *.cpp -g *.cc -o test_tnn -I /home/toybrick/TNN/TNN/include/ -L /home/toybrick/TNN/test_hy/rknpu_ddk_lib64/ -l rknpu_ddk -L /home/toybrick/TNN/TNN/scripts/build_aarch64_linux/ -l TNN
第五种
-L和-l包括和TNN, 不包括rknpu_ddk, 不使用-Wl,-rpath
编译失败,
(报错libTNN.so: undefined reference to xxx)
/usr/bin/g++ -g *.cpp -g *.cc -o test_tnn -I /home/toybrick/TNN/TNN/include/ -L /home/toybrick/TNN/TNN/scripts/build_aarch64_linux/ -l TNN
总结:
如果想用gdb调试工程,
如果工程需要so库, 并且这些so库不在标准是lib搜索路径中(LD_LIBRARY_PATH等),
1.
在g++编译时, 需要通过-L -l显式的把【所有*】so库链接进去, (不懂为啥连接TNN和rknpu_ddk就行, 另外3个so库不需要)
2.
在g++编译时, 通过-Wl,-rpath来显式指定这些so库的路径(相当于hardcode进去:https://stackoverflow.com/questions/12851184/dlopen-failed-cannot-open-shared-object-file-no-such-file-or-directory), 使得应用运行时能找到这些so库
如果只是编译工程,
如果工程需要so库, 并且这些so库不在标准是lib搜索路径中(LD_LIBRARY_PATH等),
1.
在g++编译时, 需要通过-L -l显式的把【主要】so库链接进去, (比如libTNN.so依赖librknpu_ddk.so, 链接libTNN.so就行)
2.
在g++编译时, 需要通过-Wl,-rpath来帮助其中一些so库定位-链接到另外依赖的so库, (比如libTNN.so依赖librknpu_ddk.so, librknpu_ddk.so依赖其他3个so库)
-Wl,-rpath作用
1.
指定运行时的动态库搜索路径(编译时被hardcode进去), 会优先搜索rpath路径
2.
帮助定位-链接到其他依赖的动态库