LinuxSir.cn,穿越时空的Linuxsir!

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

新手入门问题

[复制链接]
发表于 2004-1-12 18:25:03 | 显示全部楼层 |阅读模式
在一边看文档一边装LFS
看到以下地方产生了问题


../binutils-2.14/configure \
    --prefix=/tools --disable-nls


配置参数的意思是:



--prefix=/tools:这个参数告诉 configure 脚本,应该把 Binutils 软件包中的程序安装到 /tools 目录中.


--disable-nls: 这个参数禁止了国际化(通常简称i18n)。我们的静态程序不需要国际化的特性,并且在静态连接时nls常常引起错误。


接下来编译它:


make configure-host
make LDFLAGS="-all-static"


make 命令参数的意思是:



configure-host: 它强制所有的子目录都进行配置,如果没有这个参数,静态连接就会失败,因此我们暂且用它来解决这个问题。





问题:到底什么是静态连接?

L?DFLAGS="-all-static": 这个参数告诉连接器,把 Binutils 软件包中所有的程序都静态连接。然而,严格地说,首先是"-all-static" 被传递给libtool,libtool再把"-static" 传递给连接器。
发表于 2004-1-12 22:32:15 | 显示全部楼层
静态连接的说明

除了特殊的任务外,许多程序还要执行很多常用和琐碎的操作,比如分配内存,搜索目录,打开和关闭文件,读写它们,操作字符串,模式匹配,数学计算等等。为了避免让每个程序都“重新发明轮子”(意为重复的创新),GNU 系统以库文件的方式提供这些基本功能和函数。任何一个 Linux 系统中最重要的库都是 glibc。

将库文件中的函数连接到使用它们的程序中,有两种方法:静态连接或动态连接。当一个程序是静态连接时,它使用的函数会包含在可执行文件中,结果就是比较大的执行文件。当一个程序是动态连接时,可执行文件中包含的是针对连接器的引用,说明了要使用的库文件名称,以及使用的函数名称,结果就是执行文件要小多了。这个可执行文件在某种程度上比静态连接的要慢,因为在运行时连接要花一些时间。(还有第三种方法,是使用动态连接器的可编程接口,参见dlopen的man文档,以获得更多信息。)

动态连接是Linux上的缺省用法,有三个主要的优点。首先,你只需要在硬盘上有一份可执行的库文件代码,而不是在不同程序里有很多份相同的代码 -- 这样就节省了硬盘空间。第二,当几个程序同时使用同样的库函数,只需要有一份函数代码存在于内存中 -- 这样就节省了内存。第三,当库函数修正了一个 bug 后,或是做了某种程度的改进后,你只需要重新编译这个库文件,而不是重新编译所有使用已改进函数的那些程序。

为什么我们要在本章的前两个软件包里使用静态连接呢?有三方面的原因,历史原因,教育价值和技术考虑。历史上来说,以前的LFS第五章里使用静态连接来编译每一个程序。教育价值在于了解动态连接和静态连接的区别是非常有用的。从技术上说,我们可以得到独立于主系统的可执行文件。然而,应该注意,即使前两个软件包是动态连接的,还是能成功的编译LFS系统。
发表于 2004-1-12 22:38:28 | 显示全部楼层
有点象include和require!
发表于 2004-1-12 23:03:29 | 显示全部楼层
是啊,呵呵,计算机就这些东西,借来借去的,哪里都有
发表于 2004-1-12 23:12:46 | 显示全部楼层
也是!就那么两个数字!变来变去吗!什么时候我也来弄个lfs!决定了!等安装完BSD就来弄lfs吧,好像其他的linux我都用过了(除了slackware)?!
 楼主| 发表于 2004-1-13 09:11:10 | 显示全部楼层
谢谢,我的C语言基础不是很好,就是所谓的公共库和私有库的区别了吧?
发表于 2004-1-14 14:26:36 | 显示全部楼层
最初由 fishfeather 发表
谢谢,我的C语言基础不是很好,就是所谓的公共库和私有库的区别了吧?


压根没有学过C,一开始JAVA,接着就是C++了!没办法啊!人笨不敢学太高深的!^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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