Linux教程Linux
首页
基础知识
Linux业界
Linux系统
Linux人物
Linux文化
Linux资讯
Linux综合
当前位置:
Linux教程
-
Linux
- 关于Linux下编写和编译程序的几个问题
关于Linux下编写和编译程序的几个问题
作者:闫健勇
当前,虽然Linux还不很普及,在Linux下编写和编译程序的人不多。但是我相信,随着Linux性能的不断提升和逐渐普及,会有许多自由软件出现,也会有许多人成为Linux下的程序员。我结合自己的经验,介绍一下Linux下编写和编译程序所要注意的几个问题,奉献给希望为Linux的发展作出贡献的人们。
1.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别的编译器编译内核可能产生不可预想的后果。
2.怎样移植其它Unix程序到Linux上?
总得来说,Unix上的程序不需要做改动,只要简单的按照提示就可以移植到Linux上,如果安装过程中出现错误信息,而你又不知道怎么处理,你可以猜或略去,不过这样产生的程序往往带有bug。所以最好还是问一下有经验的人。
如果要从BSD-ish移植程序,试一试在编译时加上-I/usr/include/bsd 和 ?lbsd命令。
3.什么是ld.so,从哪可以找到它?
ld.so是动态函数库装载器。过去,使用共享函数库的程序在原代码开头使用约3K的空间来寻找和加载共享函数库,现在,这段代码被加进了一个特殊共享函数库/lib/ld.so,所有的程序都可以使用该共享库,这样就节省了磁盘空间,而且升级方便。
ld.so可以从以下网址得到tsx-11.mit.edu/pub/linux/packages/GCC/。
4.怎样升级库函数而不使系统崩溃?
注意:进行此操作应该养成做备份的习惯,因为这项操作很容易出错。
如果你升级象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.
如果一切工作顺利的话,你可以删除老的函数库的备份。
5.我能否把在486上编译的代码或编译器拿到386上用?
当然,除非你编译的是内核。
GCC用来在486上编译的选项-m486 只是优化了所编译程序,使其运行快一些。这些编译的程序仍能很好的在386上运行,只是效果差一些。
然而,从内核1.3.35以后,采用486或Pentium选项编译的内核不能用于386的机器。
GCC可以针对386和486进行配置。两者区别在于,针对386配置的GCC把-m386作为缺省选项,而针对486配置的GCC把-m486作为缺省选项,仅此而已。
6.gcc -O6可以干什么?
目前,它和 -O2 (GCC 2.5) 或 -O3 (GCC 2.6, 2.7)功能一样,所有版本大于它的功能也一样。新版内核的Makefiles使用-O2,所以你也应该用-O2。
7.linux/*.h 和asm/*.h在什么地方?
目录 /usr/include/linux/ 和 /usr/include/asm/低下的文件是内核头文件的软链接,内核头文件其实在目录/usr/src/kernel*/低下。
8.怎样作一个共享函数库?
对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。
9.为什么我编译的可执行程序非常大?
用ELF编译器,生成可执行程序太大最可能的原因是没有合适的.so库与你使用的库函数链接。对每一个象libc.so.5.2.18的函数库,应该有一个象libc.so的链接。
用a.out编译器,生成可执行程序太大可能是使用了-g选项,这会生成静态链接库而不是动态链接库。
10.从哪可以得到对于Linux的‘lint’?
大部分‘lint’的功能已经内置进了GCC,打开GCC的-Wall选项会打开许多有用的外部警告。
还有一个叫`lclint\的软件功能和传统的lint差不多,原代码可以在
http://larch.lcs.mit.edu
/pub/Larch/lclint/中找到。
发布人:netbull 来自:Linux一千零一夜
Linux下C语言编程--时间概念
Qmail+MH设计方案
OSKit的部件对象模型 - 摘要
TUX 2.0使用手册--四、配置脚本
GTK入门导读(Tooltips物件)
使用U盘和USB硬盘的正确方法
UNIX入侵(第三章)
给扫描仪在Linux系统里安个家
XUL教程 发布说明
Linux内核重编译常见故障及其解决方法
Beej's 网络编程指南 Internet Sockets(2)
wu-ftpd下如何限值单个用户进程数
我为什么要逃离WINDOWS阵营(原创)
入侵检测包PortSentry
内核汉化--狭隘的民族主义?
站点导航
Linux教程
Php
Linux
非技术类
指令大全
Shell
安装启动
Xwindow
Kde
Gnome
输入法类
美化汉化
网络配置
存储备份
杂项工具
编程技术
网络安全
内核技术
速度优化
Apache
Email
Ftp服务
Cvs服务
代理服务
Samba
域名服务
网络过滤
其他服务
Nfs
Oracle
Dhcp
Mysql
Ldap
RedHat
赞助商链接