简单记录一下自己开发中遇到的一个问题。如题。Linux开下交叉编译一个应用,以前直接make,没有任何问题,但是后面想用Clion,所以Makefile不需要写了,但是要改一下CMakelist.txt文件。整体迁移还是很顺畅,但是奇怪的问题出现了,交叉编译出来的文件放到目标环境执行的时候提示“No such file or directory!”
这个问题一眼就明白了,没有文件嘛,要不就是目录不对。于是就去目标目录下ls了一下,但是文件在躺得好好的。这就有点怪了。直接在文件同级目录下执行./target_file_name,结果还是同样的提示!!!这有点触及知识盲区了。难道是没给执行权限?ll了一下,显然属主是有执行权限的,实在不行都加上再试试。二话不说,chmod +x target_file_name。再次执行,还是同样的提示!!!这。。。有点过分了。难道是依赖库的问题?
有想法就好啊,马上去看了一下原来的Makefile和现在的CMakelist.txt,重点看了一下多线程库等几个依赖库,所有有引用的都引用了,编译也是妥妥的。这时发现了一个小区别,原来的Makefile中编译选项有一个-static选项,但是现在没用这个选项。于是乎给CMakefile.txt也加上了这个选项,果不其然,报错消失了。但是有一个警告,是由于引用了动态库,但是我们采用的了静态编译。
问题就已经清楚了,编译环境下的依赖库版本,路径在目标环境上有找不到的,也有版本不匹配的,所以“No such file or directory”的原因就是依赖库没有找到,而不仅仅是文件本身没有找到。
所以,解决的办法有两个:一、加入静态编译选项;二、目标环境缺少的依赖库重新编译。我这里采用了第一种,因为简单。但不是最优的,最好的方案肯定是将目标环境的依赖都按需编译一份,但是对目标环境影响很大,我们目前上线的机器都需要一一加上这些依赖,至于新的依赖会不会对系统产生其他异常,这个是未知的。而且这些依赖不只是简单的依赖,比如glibc都提示不对,这个一换,可能问题就大了。所以暂时不敢动,只能用第一种方案。但是要考虑动态引用使用静态编译带来的影响。