当前位置: 技术问答>linux和unix
应用程序移植到RT5350路由器板子上运行出错
来源: 互联网 发布时间:2017-05-24
本文导语: 本帖最后由 wangbin531134211 于 2014-07-17 17:15:13 编辑 Linux上能正常运行的程序,使用Ralink_SDK中的mipsel-linux-g++编译,版本为3.4.2,放到板子上运行,出现错误: : can't resolve symbol '_Unwind_SjLj_Register' : can't resolve symbol '_ZN...
: can't resolve symbol '_Unwind_SjLj_Register'
: can't resolve symbol '_ZNSt8ios_base4InitD1Ev'
我看了下这两个函数分别在buildroot-gcc342中的libgcc.a和libstdc++.a里面,
而我使用nm -l命令查看自己的动态库子项目(被应用程序依赖),显示
000af9fc T _Unwind_SjLj_Register /home/winfred/RT288x_SDK/toolchain/buildroot/toolchain_build_mipsel/gcc-3.4.2/gcc/unwind-sjlj.c:122
0004e650 T _ZNSt8ios_base4InitD1Ev /home/winfred/RT288x_SDK/toolchain/buildroot/toolchain_build_mipsel/gcc-3.4.2/libstdc++-v3/src/ios_init.cc:125
这应该是已经编译到我的动态库中了吧?
我的编译器位置在 /opt/buildroot-gcc342/bin
看了http://blog.sina.com.cn/s/blog_602f87700100nyda.html这篇文章,以为是自己的toolchain位置有问题,
执行mipsel-linux-gcc -v 打印出以下信息
Reading specs from /home/winfred/RT288x_SDK/toolchain/buildroot-gdb/lib/gcc/mipsel-linux-uclibc/3.4.2/specs
Configured with: /home/winfred/RT288x_SDK/toolchain/buildroot/toolchain_build_mipsel/gcc-3.4.2/configure --prefix=/home/winfred/RT288x_SDK/toolchain/buildroot-gdb --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=mipsel-linux-uclibc --enable-languages=c,c++ --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-shared --disable-nls --enable-threads --enable-multilib --enable-sjlj-exceptions : (reconfigured) /home/winfred/RT288x_SDK/toolchain/buildroot/toolchain_build_mipsel/gcc-3.4.2/configure --prefix=/home/winfred/RT288x_SDK/toolchain/buildroot-gdb --build=i386-pc-linux-gnu --host=i386-pc-linux-gnu --target=mipsel-linux-uclibc --enable-languages=c,c++ --disable-__cxa_atexit --enable-target-optspace --with-gnu-ld --disable-shared --disable-nls --enable-threads --enable-multilib --enable-sjlj-exceptions
Thread model: posix
gcc version 3.4.2
因此我将整个编译器解压到/home/winfred/RT288x_SDK/toolchain/buildroot-gdb下,但编译运行后还是出现同样的错误。
有高手知道这是什么原因吗?
谢谢
|
问题解决了,原因是我使用了libdl这个库,在程序中我是将SDK中的libdl.a静态编译到我的动态库中,今天偶然发现板子系统上的libdl.so与SDK中的libdl.so大小不一样。我的一个测试程序使用-ldl编译,在程序动态加载库时没问题,而使用SDK中提供的libdl.a静态编译的时候,出现段错误,因此怀疑是两边的libdl库不一致导致的,在Makefile中使用-ldl,问题解决。
但现在还有不明白的地方是板子上的操作系统就是用SDK里面的gcc编译的,为什么编译出来的libdl库与SDK编译器自带的libdl会不一样呢?
感谢楼上的回复,虽然没帮助解决,还是要给分的。
但现在还有不明白的地方是板子上的操作系统就是用SDK里面的gcc编译的,为什么编译出来的libdl库与SDK编译器自带的libdl会不一样呢?
感谢楼上的回复,虽然没帮助解决,还是要给分的。
|
.a是静态库,你查一下这两个函数在哪个.so文件里面,复制到板子的/lib下
|
那你在编译的时候加入参数“-L(libPlatform.so所在目录) -lPlatform”试试看
|
目录不对,都放在/lib下面。或者指定LD_LIBRARY_PATH环境变量。
|
看上去是你的动态库引用了其它的动态库,你板子上的/lib上有没有libstdc++.so文件