荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: lvyou (风雨同路卡拉Baby), 信区: Linux
标  题: 关于Linux下编写和编译程序的几个问题
发信站: 荔园晨风BBS站 (Sat Feb  2 20:55:46 2002), 转信

关于Linux下编写和编译程序的几个问题
作者: 飞鹰   www.ASPCool.com 时间:2000-5-30 0:51:01  阅读次数:1676

     关于Linux下编写和编译程序的几个问题
  · 闫健勇·CPCW

    当前,虽然Linux还不很普及,在Linux下编写和编译程序的人不多。但是我相信,随着
Linux性能的不断提升和逐渐普及,会有许多自由软件出现,也会有许多人成为Linux下的程
序员。我结合自己的经验,介绍一下Linux下编写和编译程序所要注意的几个问题,奉献给
希望为Linux的发展作出贡献的人们。


  Linux下怎样编译程序?

  大多数Linux程序都是由C语言编写的并由GNU C编译而成。现在GCC是各种发行套件的一部
分。有关最新GCC编译器的版本、文章和补丁请看ftp://ftp.gnu.org/pub/gnu/。

  由C++编写的程序必须由GNU C++编译,GNU C++也是各种发行套件的一部分,在以上网
址也有最新版本和补丁。

  编译2.0.x的内核需要2.7.2.x版本的GCC,如用象GCC 2.8.x, EGCS, or PGCC别的编译器
编译内核可能产生不可预想的后果。


  怎样移植其它Unix程序到Linux上?

  总得来说,Unix上的程序不需要做改动,只要简单的按照提示就可以移植到Linux上,如
果安装过程中出现错误信息,而你又不知道怎么处理,你可以猜或略去,不过这样产生的程
序往往带有bug。所以最好还是问一下有经验的人。

  如果要从BSD-ish移植程序,试一试在编译时加上-I/usr/include/bsd 和 ?lbsd命令。



  什么是ld.so,从哪可以找到它?

  ld.so是动态函数库装载器。过去,使用共享函数库的程序在原代码开头使用约3K的空间
来寻找和加载共享函数库,现在,这段代码被加进了一个特殊共享函数库/lib/ld.so,所有
的程序都可以使用该共享库,这样就节省了磁盘空间,而且升级方便。

  ld.so可以从以下网址得到tsx-11.mit.edu/pub/linux/packages/GCC/。


  怎样升级库函数而不使系统崩溃?

  注意:进行此操作应该养成做备份的习惯,因为这项操作很容易出错。

  如果你升级象libc4这样的老函数库,这个过程会变得非常困难。而且你应该在该系统上
让libc4和libc5共存,因为,有些老程序还需要它。升级libc5也一样。

  升级动态库的问题常出现在当你移走老的函数库时,用来升级的程序也运行不了了。有许
多方法可以解决这个问题。一个方法就是暂时备份一下运行程序所需函数库,它们一般在
/lib/、/usr/lib/、 /usr/local/lib/、或其它的地方,在文件/etc/ld.so.conf中都有详
细记录。

  例如,当你升级libc5时,目录/lib/中有如下文件

  libc.so.5

  libc.so.5.4.33

  libm.so.5

  libm.so.5.0.9

  这些是C函数库和数学库,拷贝它们到文件/etc/ld.so.conf中含有的其它的目录,如
/usr/lib/中:

  cp -df /lib/libc.so.5* /usr/lib/

  cp -df /lib/libm.so.5* /usr/lib/

  ldconfig

  一定要记住运行ldconfig来升级函数库的配置文件。

  文件libc.so.5 和 libm.so.5是实际库文件的链接文件,当你升级的时候,如果老的链接
文件存在,新的链接不会产生,除非你使用CP命令的-f选项。CP的-d选项只复制链接文件,
不复制原文件。

  如果你需要直接覆盖链接,使用ln命令的选项-f。

  例如,拷贝新的库函数覆盖旧的。先对新的函数库做一个链接,然后把函数库和链接一起
拷贝到/lib/中,命令如下:

  ln -sf ./libm.so.5.0.48 libm.so.5

  ln -sf ./libc.so.5.0.48 libc.so.5

  cp -df libm.so.5* /lib

  cp -df libc.so.5* /lib

  重申一下,拷贝完别忘记运行ldconfig.

  如果一切工作顺利的话,你可以删除老的函数库的备份。


  我能否把在486上编译的代码或编译器拿到386上用?

  当然,除非你编译的是内核。

  GCC用来在486上编译的选项-m486 只是优化了所编译程序,使其运行快一些。这些编译的
程序仍能很好的在386上运行,只是效果差一些。

  然而,从内核1.3.35以后,采用486或Pentium选项编译的内核不能用于386的机器。

  GCC可以针对386和486进行配置。两者区别在于,针对386配置的GCC把-m386作为缺省选项
,而针对486配置的GCC把-m486作为缺省选项,仅此而已。


  gcc -O6可以干什么?

  目前,它和 -O2 (GCC 2.5) 或 -O3 (GCC 2.6, 2.7)功能一样,所有版本大于它的功能也
一样。新版内核的Makefiles使用-O2,所以你也应该用-O2。


  linux/*.h 和asm/*.h在什么地方?

  目录 /usr/include/linux/ 和 /usr/include/asm/低下的文件是内核头文件的软链接,
内核头文件其实在目录/usr/src/kernel*/低下。


  怎样作一个共享函数库?

  对ELF, 命令如下:

  gcc -fPIC -c *.c

  gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o

  对a.out,从 http://tsx-11.mit.edu/pub/linux/packages/GCC/src/ 下载n.nn.tar.gz
,其中包含详细说明。建议你将共享库由a.out升级为ELF。


  为什么我编译的可执行程序非常大?

  用ELF编译器,生成可执行程序太大最可能的原因是没有合适的.so库与你使用的库函数链
接。对每一个象libc.so.5.2.18的函数库,应该有一个象libc.so的链接。

  用a.out编译器,生成可执行程序太大可能是使用了-g选项,这会生成静态链接库而不是
动态链接库。


  从哪可以得到对于Linux的‘lint’?

  大部分‘lint’的功能已经内置进了GCC,打开GCC的-Wall选项会打开许多有用的外部警
告。

  还有一个叫`lclint'的软件功能和传统的lint差不多,原代码可以在http://larch.lcs.
mit.edu /pub/Larch/lclint/中找到。



--

      忘 掉 远 方 是 否 可 有 出 路     |  忘 掉 世 间 万 千 广 阔 土 地
      忘 掉 夜 里 月 黑 风 高           |  忘 掉 命 里 是 否 悲 与 喜
      踏 雪 过 山 双 脚 虽 渐 老        |  雾 里 看 花 一 生 走 万 里
      但 靠 两 手 一 切 达 到           |  但 已 了 解 不 变 道 理

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 203.93.19.1]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店