交叉编译时遇到的一个坑 |
您所在的位置:网站首页 › 动态编译错误 › 交叉编译时遇到的一个坑 |
交叉编译时碰到的一个坑
动态编译静态编译一些错误的怀疑静态编译动态编译混合
动态编译
由于我们的板子是arm架构,而开发使用的pc机器是x86架构,所以在pc机上开发出来的程序要想在arm板子上运行,需要用交叉编译工具链,类似arm-linux-gcc这种,编译成arm平台上可运行的二进制文件才可以。如果你除了自己写的代码,还引用了一些第三方库,类似boost这种,你还得把boost库也用交叉编译工具重新编译下才能用。当然还要注意32位64位这种问题。 我一开始只把g++换成了arm-linux-g++,编译后运行,结果报错说找不到动态库。所以我决定进行静态编译,将需要的库都编译进可执行文件中,在目标平台上可直接运行。 静态编译于是我就在makefile文件的后面加了一个 -static,来进行静态编译。编译成功了,但是有一个tcp的某个函数里有一个关于glibc的警告,如下: 我怀疑是系统的问题,平台的问题,板卡的问题。于是我更换了另一个arm平台的板卡,发现一模一样的段错误也发生了。其他的关于程序上的怀疑也不对,因为该程序在x86平台上运行的好好的,所以程序出bug的可能性也很小。 静态编译动态编译混合十分不合常理的问题。虽然出错的是boost 的局部变量,但是这种诡异或不合常理的事情一发生,那你就不能从眼前那个问题去找答案了,它可能是别的问题,引发了眼前的这个极其不合常理的问题。至此,我开始回头看那个警告。 "warning: Using 'getpwnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking"它貌似是在说,gethostbyname在动态库中,却用static的方式链接了。因此我把boost的库用静态链接,把pthread这种标准库用了动态链接,写法是这样: arm-linux-g++ main.cpp -o server -Wl,-dn -L/boost/lib -lboost_serialization -Wl,-dy -lpthread编译后果然没有警告了。 我放到板子上运行以后,发现报错找不到c++标准库,即libstdc++.so.6.这个板子上啥都没有,c++的标准库还是装一个比较好,要不然连helloworld都运行不了。所以我拷贝了一个32位的libstdc++.so.6的动态库到板子上,再执行就全部ok啦。 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |