LinuxSir.cn,穿越时空的Linuxsir!

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

编译程序的时候怎样把库文件静态链接到目标程序内?[基本解决]

[复制链接]
发表于 2004-4-3 06:34:20 | 显示全部楼层 |阅读模式
比如编译xpdf需要libXm、libpaper、freetype2、libt1,怎样把它们链接进xpdf中,使得xpdf在任何linux系统上运行都不会出现缺少libXm、libpaper、freetype2、libt1的情况?
 楼主| 发表于 2004-4-3 09:34:37 | 显示全部楼层
盼望解答,感谢!先睡会儿... ...
发表于 2004-4-3 09:50:22 | 显示全部楼层
$ gcc -static foo.c
 楼主| 发表于 2004-4-3 19:54:46 | 显示全部楼层
最初由 dearvoid 发表
$ gcc -static foo.c

谢谢啊,可是xpdf链接的是libX.so.XX这样的文件,编译时用的config、make,该怎么办呢?
发表于 2004-4-3 22:04:13 | 显示全部楼层
lfs文档对此有详细的说明。
首先引用一段文字来说明静态链接。
静态连接的说明

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

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

至于静态链接的实现,在lfs文档的第五章几乎都是这类例子。我用"第五章binutils的第一次安装"来说明一下。

  1. ../binutils-2.14/configure \
  2.     --prefix=/tools --disable-nls
复制代码

可见,静态编译对于不同的程序需要不同的configure配置(如果需要的话)。这里添加--disable-nls选项的出发点是"静态程序不需要国际化的特性,并且在静态连接时nls常常引起错误"。

  1. make configure-host
  2. make LDFLAGS="-all-static"
复制代码

make是静态链接最关键的一步,传递静态链接的参数。lfs的解释如下:
LDFLAGS="-all-static": 这个参数告诉连接器,把 Binutils 软件包中所有的程序都静态连接。然而,严格地说,首先是"-all-static" 被传递给libtool,libtool再把"-static" 传递给连接器。


总而言之,如果要静态编译一个源码包,除了上面的LDFLAGS外,还要参见源码包附带的文档跟进更详细的做法。

题外话地说,在下学Linux是从lfs开始入门的,它涉及了一个系统的很多细节,我建议大家有空的话,最好做一次lfs,把这些细节理清,为后续的学习扫清不必要障碍。
 楼主| 发表于 2004-4-3 22:09:17 | 显示全部楼层
谢谢home_king!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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