gdb调试包含多个动态库so库的简单工程


(一共>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.
帮助定位-链接到其他依赖的动态库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值