交叉编译imx6ull,我用的arm-linux-gnueabihf-gcc,版本是7.4.0。
后来按教程制作debian文件系统,里面有个安装gcc,apt install gcc。安装完后一看版本是6.4.0.
这两个gcc的作用分别是什么?
交叉编译gcc,是用来编译uboot和内核的,我以为内核里应该有这个gcc。那么根文件系统里的软件,应该也是用这个gcc编译好的。
但是,现在根文件系统也安装了个gcc...
离线
- 内核里面没有gcc
- 一共有两个交叉工具链
- 7.4.0是你在ubuntu的交叉工具链,是在ubuntu上用的。
- 根文件系统里面的gcc,是在开发板上用的。
- 两个gcc都可以编译linux程序,然后在开发板上运行。
你仔细想想,差不多是一回事,又不是一回事。
离线
- 内核里面没有gcc
- 一共有两个交叉工具链
- 7.4.0是你在ubuntu的交叉工具链,是在ubuntu上用的。
- 根文件系统里面的gcc,是在开发板上用的。
- 两个gcc都可以编译linux程序,然后在开发板上运行。你仔细想想,差不多是一回事,又不是一回事。
那,两个Gcc版本不一致也没事?
离线
文件系统需要统一的gcc版本, 也就是 libc 和你的 app用同一个gcc, 如果你的 app 静态链接, 连这个gcc都不需要一致。
kernel(zImage)和 ko文件得用同一个 gcc 版本编译。
其他随意, 没有强制要求。
离线
分清楚GCC交叉编译的host和target配置就能理解清楚了。
如果还分不清,建议自己手动编一次GCC就晓得是啥了,然后你就可以理解清楚。
然后你就可以发现原来GCC可以生成多个平台目标,只是某些原因变得不可以,改改后也可以。
GCC还提供了很多关键库,很多功能子集,反正搞懂GCC的交叉编译,会对你其他程序的交叉编译提供很好的思路
离线
有区别,但是可以用。
楼主用stm32吗,就像你用KEIL4和KEIL5都可以编译stm32的程序,虽然两者的版本不一样。。。宏观上差不多可以这样理解~
那,两个Gcc版本不一致也没事?
最近编辑记录 Jmhh247 (2020-01-15 10:33:10)
离线
我也来说一嘴,交叉编译gcc和安装到开发板的gcc是两个东西,就是版本不一样也能够运行,为啥呢,看官别忘了,你在移植文件系统busybox的关键一步就是把交叉编译的gcc的lib库复制到busybox里面,这就解释了你动态编译时候,应用系统要查找库,要到文件系统里查找,但是如果你在开发板上安装了gcc进行编译而生成的文件运行,调用的又是板子自带gcc的lib库,两个lib库不冲突,所以没事。相当于两个不同编译的文件是各找各妈,各管各家,老死不相往来,谁也不搭理谁,但是你要是板子上的gcc编译的文件调用交叉编译的lib库,就可能运行失败了
最近编辑记录 小智 (2020-01-15 11:18:32)
离线
对于楼主的第一个问题,交叉编译系统里没有交叉编译的gcc,但是必须有交叉编译的lib库,所以应用文件只能运行,而不能编译,交叉编译,交叉编译的运行环境是主机环境,而不是嵌入式环境,
最近编辑记录 小智 (2020-01-15 11:24:52)
离线
感谢各位回复,理解了些。
离线
学习了,顶一下!
离线
比如我要编译qt,需要交叉编译,那么我用之前编译uboot及内核的gcc7.4.0?还是用文件系统里安装的gcc6.4.0?
离线
交叉编译器,无他,方便。
离线