LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2026|回复: 14

关于编译过程中--build、--host、--target的疑惑

[复制链接]
发表于 2009-5-15 20:04:18 | 显示全部楼层 |阅读模式
这三个的作用还是比较好理解的,主要在交叉编译时比较有用。
在autoconf.pdf中,可以看到:
If you mean to override the result of config.guess, use ‘--build’, not ‘--host’, since the latter enables cross-compilation. [color="Red"]For historical reasons, whenever you specify ‘--host’, be sure to specify ‘--build’ too; this will be fixed in the future.
这里提到要使用--host时必须带上--build,但是在clfs(Version 1.1.0-x86)手册中:
Chapter 5. Constructing Cross-Compile Tools
5.6. Cross Binutils-2.18
--host=${CLFS_HOST} --target=${CLFS_TARGET}
5.7. Cross GCC-4.2.4 - Static
--host=${CLFS_HOST} --target=${CLFS_TARGET}
5.9. Cross GCC-4.2.4 - Final
--target=${CLFS_TARGET} --host=${CLFS_HOST}
为什么上面三个引用中更改了--host而没有带上--build?
5.8. Glibc-2.7
--host=${CLFS_TARGET} --build=${CLFS_HOST}
上面的引用中为什么--host就是${CLFS_TARGET}了呢?

Chapter 6. Constructing a Temporary System
6.3.1. Installation of Binutils
--build=${CLFS_HOST} --host=${CLFS_TARGET} --target=${CLFS_TARGET}
6.4.1. Installation of GCC
--build=${CLFS_HOST} --host=${CLFS_TARGET} --target=${CLFS_TARGET}

上面两个引用中为什么还要添加上--target呢,不是没有指定--target时,其值为--host的值得么?
而下面的引用中就没有添加上--target,这有什么区别的呢?
6.5. Ncurses-5.6
--build=${CLFS_HOST} --host=${CLFS_TARGET}
6.6. Bash-3.2
--build=${CLFS_HOST} --host=${CLFS_TARGET}
6.8. Coreutils-6.9
--build=${CLFS_HOST} --host=${CLFS_TARGET}

6.9. Diffutils-2.8.7
6.10. Findutils-4.2.32
6.12. File-4.23
6.13. Gawk-3.1.6
也是同样如此
 楼主| 发表于 2009-5-15 20:08:56 | 显示全部楼层
交叉编译时,是不是只有toolchain编译时需要加上--target,而对于其他的工具,只要有--host即可,--target是没有对非toolchain是没有任何意义的?不知是否是这样,请大侠指点~~

还有clfs是不是只做两次即可,即在编译时添加上--host --target参数即可?
譬如先在i686上编译出--host=i686 --target=ppc的toolchain,然后用该toolchain来编译各种工具(包括toolchain in ppc)
这样两次就可以做到i686>>ppc等
————————————————————————————————————————————————————————————————————
做一次是不是也可以的,用i686上的toolchain,编译时添加上--host=ppc,是不是即可?

这两种方法哪种比较好点?哪种用的比较多?

gcc在编译时,生成的二进制文件命名是否会参照--build --host --target参数的值得?给人的感觉是生成的二进制文件的名会添加前缀,但是具体的规则是怎样的?还请大侠来讲讲。先行谢过了~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-16 18:08:19 | 显示全部楼层
谁来讲讲gcc编译时生成程序的名称的prefix是怎么决定的?
貌似在用arm-gcc来编译程序时,会去寻找arm-cpp arm-cc1 arm-ld arm-as等程序
而gcc在编译时生成的程序在安装时会添加上个prefix,这个具体的规则是怎样的呢?
回复 支持 反对

使用道具 举报

发表于 2009-5-16 22:09:04 | 显示全部楼层
--build --host --target 本版已有帖子做了详细讨论,请搜索。
为什么上面三个引用中更改了--host而没有带上--build?
您的想法没错,而且应该加上 --build,clfs-1.x.x 的方法只是恰好没问题罢了。
您换 gcc-4.3.x 还省略 --build 就会出问题了。
build 会自动设置,虽然自动设置的值不一定总是合适的。
上面的引用中为什么--host就是${CLFS_TARGET}了呢?
glibc 最后要在那里运行呢?
上面两个引用中为什么还要添加上--target呢,不是没有指定--target时,其值为--host的值得么?
而下面的引用中就没有添加上--target,这有什么区别的呢?
binutils gcc 是 工具链 的 一部分,要保证绝对的正确安装。
只有工具链部分才会出现 --build --host --target 均不同的情况,虽然一般用不到。
其它工具使用普通的交叉编译即可。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-17 11:07:14 | 显示全部楼层
binutils gcc 是 工具链 的 一部分,要保证绝对的正确安装。
只有工具链部分才会出现 --build --host --target 均不同的情况,虽然一般用不到。
其它工具使用普通的交叉编译即可。
这个我明白的
但是我提到的
6.3.1. Installation of Binutils
--build=${CLFS_HOST} --host=${CLFS_TARGET} --target=${CLFS_TARGET}
6.4.1. Installation of GCC
--build=${CLFS_HOST} --host=${CLFS_TARGET} --target=${CLFS_TARGET}
--host和--target是一样的,为什么还要--target呢?
回复 支持 反对

使用道具 举报

发表于 2009-5-17 12:53:43 | 显示全部楼层
binutils gcc
--build=${CLFS_HOST} --host=${CLFS_TARGET} --target=${CLFS_TARGET}
表示在宿主机构建,运行于目标机,用来生成目标机二进制代码的 工具链。
在宿主机构建:构建过程中有些中间程序需要运行于宿主,需要宿主自己的工具链来编译。
运行于目标机:构建生成的程序是目标机上的可执行程序。
用来生成目标机二进制代码:构建生成的程序是目标机上的本地编译工具链。

为什么需要 --build?
您可以使用 i486-linux-gnu 的系统,但使用 i686 甚至 x86_64 的内核,这种情况您就必须手工指定正确的参数,否则 autotool 会自作主张,有可能给出错误值。

为什么需要 --target?
您必须告诉配置系统工具链生成的目标代码类型,不要想当然。
还有问题,请自己动手验证,您会发现动一次手,几乎能解决您所有问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-17 13:02:02 | 显示全部楼层
我现在在msys+mingw环境下编译mingw
所参考的过程中有的只有--build参数,而有的只有--target参数
而对这三个参数又不是很理解,所以会有这些问题
为什么需要 --build?
您可以使用 i486-linux-gnu 的系统,但使用 i686 甚至 x86_64 的内核,这种情况您就必须手工指定正确的参数,否则 autotool 会自作主张,有可能给出错误值。
请问下config.guess的输出结果是系统的i486-linux-gnu值还是i686/x86_64内核的值?
而--build需要的属性是系统的值还是内核的值呢?
为什么需要 --target?
您必须告诉配置系统工具链生成的目标代码类型,不要想当然。
我只是觉得如果--target跟--host一样时,--target就显得有点多余。而这个事按照antoconf手册中说的推断而来的
回复 支持 反对

使用道具 举报

发表于 2009-5-17 13:43:00 | 显示全部楼层
刚开始还是老老实实用主流系统吧,msys+mingw 可是绝对的非主流。
您真要一意孤行,也应该用cygwin。
msys+mingw 缺少很多构建工具链必须的 gnu 工具程序。

--build 使用系统值,对应宿主工具链。
不同 autotool 版本给出的默认值有出入,最明显的是 gcc-4.2.x gcc-4.3.x 的区别。(autotool 是自包含的,与宿主 autotool 版本无关)

再次提醒您不要想当然,存在的东西自有存在的理由,那是很多人多年经验的积淀。
不明白可以先记下来,随着您经验积累,您慢慢会明白为什么要那样,甚至您有可能提出更合理的解决方案。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-17 14:32:21 | 显示全部楼层
下面是我在论坛搜索到得关于这三个参数的作用的说法,跟我想的一样。至于详细的讨论没有看到,还请明示。
http://www.linuxsir.cn/bbs/showt ... ghlight=host+target
--build = 软件在什么平台下编译
--host = 软件在什么平台下运行
--target = 软件为什么平台服务(仅限开发工具链)

host= 后面的参数是四个部分:
架构-厂商-内核-标准库

例如 arm-generic-linux-gnu 表示 arm 架构,generic 厂商,linux内核,gnu glibc 标准库。
http://www.linuxsir.cn/bbs/showt ... ghlight=host+target
你需要搞清楚 --build --host --target 三个参数的含义,一般来说,同时指定这三个参数,正常configure的概率最高。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-5-17 14:38:57 | 显示全部楼层
下面是我对inutils源码包做./configure做了个对比
lofeng@HDU002 /build/binutils-2.19.1
$ ./configure
checking build system type... i686-pc-mingw32
checking host system type... i686-pc-mingw32
checking target system type... i686-pc-mingw32

checking for a BSD-compatible install... /bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for gcc... gcc
checking for C compiler default output file name... a.exe

checking where to find the target ar... just compiled
checking where to find the target as... just compiled
checking where to find the target cc... host tool
checking where to find the target c++... host tool
checking where to find the target c++ for libstdc++... host tool
checking where to find the target dlltool... just compiled
checking where to find the target gcc... host tool
checking where to find the target gcj... host tool
checking where to find the target gfortran... host tool
checking where to find the target ld... just compiled
checking where to find the target lipo... host tool
checking where to find the target nm... just compiled
checking where to find the target objdump... just compiled
checking where to find the target ranlib... just compiled
checking where to find the target strip... just compiled
checking where to find the target windres... just compiled
checking where to find the target windmc... just compiled
这里的build host target都是i686-pc-mingw32
跟$ gcc -dumpmachine出来的结果一致
$ gcc -dumpmachine
i686-pc-mingw32
还有编译链接时使用的ld为什么是just compiled?生成ld的过程不是也是需要host ld的么?

lofeng@HDU002 /build/binutils-2.19.1
$ ./configure --build=mingw32
checking build system type... i386-pc-mingw32
checking host system type... i386-pc-mingw32
checking target system type... i386-pc-mingw32

checking for a BSD-compatible install... /bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for gcc... gcc
checking for C compiler default output file name... a.exe
checking whether the C compiler works... yes
checking whether we are cross compiling... no
指定了--build=mingw32,反而build host target都变成了 i386-pc-mingw32,而不是mingw32,这是何故呢?
lofeng@HDU002 /build/binutils-2.19.1
$ ./configure --target=mingw32
checking build system type... i686-pc-mingw32
checking host system type... i686-pc-mingw32
checking target system type... i386-pc-mingw32

checking for a BSD-compatible install... /bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for gcc... gcc
lofeng@HDU002 /build/binutils-2.19.1
$ ./configure --target=arm   
checking build system type... i686-pc-mingw32
checking host system type... i686-pc-mingw32
checking target system type... arm-unknown-none

checking for a BSD-compatible install... /bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for gcc... gcc
上面两个引用中,都是改变了--target,这样一来,也就只有target type发生了变化,但是不明白为什么一个变成i386-pc-mingw32、而另一个变成arm-unknown-none
lofeng@HDU002 /build/binutils-2.19.1
$ ./configure --build=arm
checking build system type... arm-unknown-none
checking host system type... arm-unknown-none
checking target system type... arm-unknown-none

checking for a BSD-compatible install... /bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for gcc... gcc
lofeng@HDU002 /build/binutils-2.19.1
$ ./configure --host=i686
configure: WARNING: If you wanted to set the --build type, don't use --host.
    If a cross compiler is detected then cross compile mode will be used.
checking build system type... i686-pc-mingw32
checking host system type... i686-pc-none
checking target system type... i686-pc-none

checking for a BSD-compatible install... /bin/install -c
checking whether ln works... yes
checking whether ln -s works... yes
checking for i686-gcc... no
checking for gcc... gcc

checking for C compiler default output file name... a.exe
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables... .exe
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for i686-g++... no
checking for i686-c++... no
checking for i686-gpp... no
checking for i686-aCC... no
checking for i686-CC... no
checking for i686-cxx... no
checking for i686-cc++... no
checking for i686-cl... no
checking for i686-FCC... no
checking for i686-KCC... no
checking for i686-RCC... no
checking for i686-xlC_r... no
checking for i686-xlC... no

checking for g++... g++
checking whether we are using the GNU C++ compiler... yes
checking whether g++ accepts -g... yes
checking for i686-gnatbind... no
checking for gnatbind... no

checking for i686-gnatmake... no
checking for gnatmake... no
使用--host时启动交叉编译模式,这时,根据上面的checking提示,会去寻找i686-gcc
i686-g++
i686-c++
等工具,而这些工具的名称,又是怎样保证他们会有这个i686这个前缀的呢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表