+ -
当前位置:首页 → 问答吧 → clfsv2问题请教:为什么需要编译第二次gcc

clfsv2问题请教:为什么需要编译第二次gcc

时间:2008-06-30

来源:互联网

用CLFS v2方法编译系统,编译支持c的gcc不需要完整的目标glibc,而第二次编译支持c和c++的gcc则需要,请问是什么原因呢?如果目标系统不使用以c++为源码的包,是不是就不必编第二次gcc呢?

作者: ukyo111   发布时间: 2008-06-30

两次的prefix不一样.第一次prefix=/tools,建立工具链.第二次才是用于目录系统的.我认为第一次可以跳过.不知道讲得对不对

作者: win2linux   发布时间: 2008-07-01

ls不对,两次make gcc都是做的交叉版本,注意是CLFS v2

作者: ukyo111   发布时间: 2008-07-01

第一次是静态编译,不生成动态库,第二次则生成,不只是c++支持的问题

作者: 许木木   发布时间: 2008-07-01

第一遍gcc只是为编译glibc而编译的,gcc第二遍是生成交叉编译用的工具链工具

作者: cityvagrant   发布时间: 2008-07-02

ls两位说的我也知道,如果第一次编译就把--disable-shared去掉编译出动态库,假如不需要gcc支持的话,那么这个gcc是不是就可以作为交叉工具链的gcc呢?

作者: ukyo111   发布时间: 2008-07-02

引用:
作者: ukyo111
ls两位说的我也知道,如果第一次编译就把--disable-shared去掉编译出动态库,假如不需要gcc支持的话,那么这个gcc是不是就可以作为交叉工具链的gcc呢?
你实践一下就知道了。要编译动态库,就需要Glibc提供的启动代码。但是在完成Glibc之前我们没有这个,所以第一遍无法编译出使用动态库的gcc

作者: 地球发动机   发布时间: 2008-07-04

谢谢,有空试一下

作者: ukyo111   发布时间: 2008-07-04

这个问题的根源在于Richard M. Stallman,甚至可追溯到c语言创建者Ken Thompson、Dennis Ritchie。

gnu工具链分散在三个软件包
binutils——汇编器、连接器
gcc——预处理器、编译器
glibc——c库
好处是灵活,可以使用其他c库,如uclibc、uc-libc、newlib,
坏处是gcc、glibc有循环依赖问题,工具链自举时需要编译gcc两编,
第一遍编译的gcc是裸编译器,也就是没有任何库支持的编译器,只能编译glibc、linux-kernel等一类完全自给自足的软件包。

如果把3者整合到一个软件包,一编编译工具链是可能的,可这样与unix哲学相违背。

PS:中文已经把stallman糟蹋了,为“高人”默哀。

作者: 聚焦深空   发布时间: 2008-07-11

现在在4.3系列下编译交叉编译GCC甚至可能需要三步:
1、编译裸编译器(之前好歹有个libgcc,现在是真正不含任何目标机器代码的裸编译器)
2、安装目标机器的Glibc头文件
3、编译仅有libgcc支持的编译器
4、编译安装Glibc
5、正常编译

作者: 地球发动机   发布时间: 2008-07-12

引用:
请问是什么原因呢?如果目标系统不使用以c++为源码的包,是不是就不必编第二次gcc呢?
是,如果你不用 c++ 的话,最后一次 gcc 可以不装,我曾经最后一次 gcc 安装时,最后一步的 make instll 没有做,但我用原来第一遍的 gcc 编译程序的时候,一直没有问题,后来在编译一个需要 c++ 的包才发现原来没有 c++ 编译器,呵呵。

不过这样的话,你需要调整,确保你的 gcc 一些默认搜索路径。

有个疑问,不知道如果最后一次 gcc 一点都不做,连 make 都不做的话,结果会不会和我上面的一样??

有高人试过没?
LZ 可以尝试一下,先做到 glibc,然后快照保存,看看能不能用

作者: panly   发布时间: 2008-07-18

引用:
两次的prefix不一样.第一次prefix=/tools,建立工具链.第二次才是用于目录系统的.我认为第一次可以跳过.不知道讲得对不对
第一遍和第二遍的 prefix 是一样的,只是其它的一些选项不一样,像 --enable-share 什么的,两次都是用于目标系统的,我的理解是这样,高人确认一下

作者: panly   发布时间: 2008-07-18

引用:
第一次是静态编译,不生成动态库,第二次则生成,不只是c++支持的问题
说的太笼统,这都是大家了解的。
能不能解释一下这个动态库是干吗?都是哪些文件吗?谁使用它?
还有就是第二次除了 c++ 支持外还有什么??

请指教

引用:
要编译动态库,就需要Glibc提供的启动代码。但是在完成Glibc之前我们没有这个,所以第一遍无法编译出使用动态库的gcc
说的好,请大大再稍微的解释一下 gcc 使用这个动态库干吗?是运行时库吗?
手册上关于这个库的原文是这样的:
--enable-shared
Enable the creation of the shared libraries.
--disable-shared
Disables the creation of the shared libraries.

引用:
第一遍编译的gcc是裸编译器,也就是没有任何库支持的编译器,只能编译glibc、linux-kernel等一类完全自给自足的软件包
还是两位大大总结的好啊,但小子觉得还有些不全面,呵呵!!

glibc 只需要头文件,而 linux 内核头文件和链接库都不使用,所以它们是“完全自给自足”,所以第一遍的 gcc 能够编译这些。

但这并不是说,第一遍的不能编译其它的使用动态链接库的程序,只要你已经编译了 glibc 链接库,那么第一遍的 gcc 就能用已经编译出的 glibc 链接库来编译其它的程序,并且是动态链接,只是你在运行编译出的二进制文件时需要把相应的编译时使用的链接库拷贝过去。

请各位指正

作者: panly   发布时间: 2008-07-18

嗯,我觉得第一次产生的gcc是可以进行编译的,不过仅仅支持C语言而已。

作者: youbest   发布时间: 2008-07-22

不推荐这样做,详见
http://bbs.linuxsir.org/thread267672-4.html
51贴

作者: 聚焦深空   发布时间: 2008-07-22

引用:
嗯,我觉得第一次产生的gcc是可以进行编译的,不过仅仅支持C语言而已。
引用:
不推荐这样做,详见
http://bbs.linuxsir.org/thread267672-4.html
51贴
这么说,第一遍的 gcc 能够编译并动态链接目标机上的 C 程序,呵呵,这一点就够了,虽然可能没人真的去这么做,但明白的话可以更好的了解交叉工具链。

多谢两位!!

作者: panly   发布时间: 2008-07-22