Linux程序有两种形式,一种是executable file,一种是scripts,分别对应windows下的exe程序和.bat,.com脚本,Linux不需要文件后缀名,是由File System Attribute来确定一个文件是否是可执行的。
一般的程序在以下两个文件夹中:
/bin: 系统程序
/usr/bin: 用户的程序,包括常用的开发程序,如Gcc,Gdb,Python等等
头文件
一般头文件都在/usr/include中,当需要使用不在默认目录的头文件时,需要使用-I
如: $gcc -I/usr/openwin/include fred.c
此时编译器除了标准目录之外,在编译fred.c时还会查看/usr/openwin/include目录
Library文件
标准的库文件一般都在/lib和/usr/lib中,默认情况下连接器只会链接标准C的库文件(所以即使将库文件放在了标准目录中,如果它不属于标准C库函数,连接的时候需要指明)。
库文件的两种形式:.a静态库文件 .so动态库文件
链接在标准目录中的非标准C库文件的两种方式:
$gcc -o fred fred.c /usr/lib/libm.a
$gcc -o fred fred.c -lm
使用后一种的好处是如果有动态的库文件,连接器会优先使用动态库文件进行连接
当要连接的库文件不在标准目录中时:
$gcc -o x11fred -L/usr/openwin/lib x11fred.c -lX11
此时除了搜索标准目录,连接器还会搜索/usr/openwin/lib
静态库文件和动态库文件的区别
首先,静态库文件在连接的时候也仅仅只会链接该库文件中被程序用到的部分(其他部分并不包含,例如下面的例子中,program仅仅用到了bill.c中的函数,虽然libfoo.a中包含了fred.o和bill.o,但只有bill.o被链接倒program中)
但是当有多个程序用到该库中的某个函数时,该函数会被永久地链接到每个程序中,因此无论是在磁盘还是内存中(运行的时候)会有重复的拷贝。
而动态库文件(.so)则可以解决这一问题,.o文件被链接时,用到的库文件的函数并未被包含,而是仅仅只有一个引用,当程序运行时用到该函数才会被调入内存(因此也会导致一定的开销)。好处是动态库的更新并不会影响到程序(程序无须全部重新编译,例如Apache服务器中的许多模块都是动态的)
生成静态库文件
$gcc -c fred.c
$gcc -c bill.c//仅编译不连接
$ar -crv libfoo.a bill.o fred.o//生成库文件libfoo.a
$nm libfoo.a//可以查看静态库文件中的模块
$ranlib libfoo.a//创建索引
使用静态库文件
创建一个lib.h文件,进行一下函数声明
void bill(char *);
void fred(int);
Program.c中包含lib.h头文件
$gcc -o program program.o libfoo.a
或者$gcc -o program program.o -L. -lfoo (-L.表示将当前目录加入当库文件的搜索区域内)
查看某个程序需要用到哪些动态库文件
$ldd program
其中ld.so是用来进行动态加载的程序,是必需的,一般是/lib/ld-linux.so.*(版本号)
分享到:
相关推荐
Beginning Linux Programming 4th
Beginning Linux Programming, 4th Edition。电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍。
linux程序设计(第三版).pdf 英文版 Beginning Linux Programming 3rd Edition pdf
Beginning Linux Programming.学习linux编程必看的书。非常经典。
Welcome to Beginning Linux Programming, 4th Edition, an easy-to-use guide to developing programs for Linux and other UNIX-style operating systems.
linux编程 Beginning Linux Programming,3rd Ed 2004.pdf
Beginning Linux Programming, Fourth Edition continues its unique approach to teaching UNIX programming in a simple and structured way on the Linux platform. Through the use of detailed and realistic ...
Beginning linux programming(随书源码,非书籍) 从Linux编程开始,第四版继续以独特的方式在Linux平台上以简单和结构化的方式教授UNIX编程。 通过使用详细而实际的示例,学生可以边做边学,并且能够从Linux初学者...
Beginning Linux® Programming 4th Edition Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x Foreword. . . . . . . . . . . . . . . . . . . . . ....
Beginning Linux Programming 英文版第三版
linux程序设计第四版源代码,附加勘误表
Beginning Linux Programming, 4th Edition Neil Matthew, Richard Stones 816 pages October 2007
Wrox - Beginning Linux Programming
Beginning Linux Programming 3rd edition.pdf
linux程序设计 英文版 Beginning Linux Programming 4th Edition linux程序设计入门,经典之作,值得一看!
Beginning Linux Programming(3th).part01.rarBeginning Linux Programming(3th).part01.rarBeginning Linux Programming(3th).part01.rarBeginning Linux Programming(3th).part01.rar