遇到问题---Arm交叉编译遇到的问题

问题及解决积累

Posted by VK on September 8, 2019

交叉编译遇到的问题:

1. 编译的时候,./configure 时必须加上 –host 和 –target,否则即使配置了环境变量使得默认为arm-linux-gcc,也不会交叉编译
2.需要指定CC,并且是绝对路径,否则如果只配置host和target,即便configure通过了,那么make的时候也会报错,比如报错“unrecognized -marm”,原因就是默认使用了GCC而host和target又指定了arm-gcc,不匹配报错
3.发现configure成功后,make的时候失败了:
  • 找不到lc:要么是编译时所需链接的是静态libc.a,而库只找到libc.so 要么就是没有指定-L的搜索路径

解决方法:1.软链接一个静态库或者将configure里的-static静态编译选项去掉或改成-nostatic

​ 2.在LDFLAGS指定-L目录指定libc.so或libc.a的路径,如果还不行,则通过CFLAGS=-L/ -I 去设置,但有一个问题需要留意就是,同一个configure中在不同的阶段可能有很多不同的编译方式,因此有时设置了CFLAGS,那么该处编译OK了,但后面的编译链接同样的库时依旧类似的报错,这时不是因为CFLAGS没有生效,而是它在这里可能用到了CPPFLAGS或CXXFLAGS,因此需要再次设置CPPFLAGS或CXXFLAGS,之后,继续执行configure,报错消失,在config.log中查看对应的-L已生效

4. ./configure出错时,一定要看config.log 根据里面的报错一步一步解决。并且可以修改configure里面的内容,以达到不报错的目的
5. make的时候,还可能出现类似arm-linux-randlib command not found 的问题,然后查看config.log 发现,PATH已经设置了呀,怎么不行呢,目前发现有时即便PATH设置了好像也没用,这时候需要./configure RANLIB=“xxx” 指定arm-linux-randlib的绝对目录,然后执行configure,通过config.log查看对应的宏环境变量已经生效,重新执行make,编译通过。 PS:有一点需要注意的是,即便./configure -help 可以查看到参数,但有些可设置参数并不一定能在help中看到,工程师偷懒没写可能,然后你可以根据经验和config.log里面已经生成的一些宏变量 去推测一些宏参数,然后去设置,就好比这里的RANLIB,help中只有LTO_RANLIB, 但在config.log中可以看到有前缀和GCC一样的RANLIB的宏变量,因此前缀一样的情况下,gcc可以是CC,那么推测ranlib应该就是本身名字大写RANLIB,于是尝试后,完美
6.虽然看config.log 很有用,但有时未必。途中遇到了“linux - No include path in which to search for limits.h ”的错误,以为是找不到limit.h文件,还傻傻的在改各种configure参数各种FLAG,包含各种路径,结果发现能做的都做了 还是不行。然后退回来,发现执行./configure的时候,报了一个错写着“unsupport host,sorry”,后来一查,发现configure文件里面写死了对应的arm类型为armv7*,因此交叉编译成自己平台的arm时出错了。这时候,只要将configure文件里面的armv7改成arm,就完美解决了

注意:make里面的报错,基本都需要重新执行./configure,设置对的参数或环境变量才能解决