《Linux程序设计》学习笔记(一)——库

存放指令的目录

/bin 启动系统时使用

/usr/bin 用户使用的指令

/usr/local/bin 安装的程序、指令

/sbin /usr/sbin 供root用户使用

在PATH环境变量

头文件

提供对常量的定义

对系统函数、库函数调用的声明

位于/usr/include

用-I指定头文件所在目录,如:

$gcc -I/usr/openwin/include fred.c

库文件

预先编译好的函数的集合

标准系统库在/lib和/usr/lib

必须遵循特定命名规范并在命令行明确指定

命名规范:lib名字

.a 静态函数库

.so 共享函数库

指定搜索特定库,如:

$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

共享库

程序本身不包含库函数代码

而是只引用库函数代码

当程序执行时

对程序库函数的引用被解析

由此加载共享库

多个程序公用一份库

库的更新独立于依赖它的程序

静态库

又称归档文件(archive)

后缀为.a

使用ar和gcc -c进行创建

尽可能把函数放在不同源文件

公共数据使用静态变量放在同一源文件

使用库函数

程序里包含一个头文件,头文件里有该函数声明

连接器负责将代码和函数库结合在一起

ld.so

负责装载共享库并解析客户函数引用的程序

动态装载器

/etc/ld.so.conf 用于搜索共享库的位置,用ldconfig来配置

ldd

查看程序需要的共享库

用法:$ldd program

静态库实验

创建一个库,包含2个库函数:fred(int) 和bill(char *) ,主程序为 program.c 。

①创建fred.c

[c]
#include<stdio.h>
void fred(int arg)
{
printf("fred:%dn",arg);
}
[/c]

②创建bill.c

[c]
#include<stdio.h>
void bill(char *arg)
{
printf("bill:%sn",arg);
}
[/c]

③将源代码编译为目标文件

gcc -c bill.c fred.c

-c选项阻止编译器创建完整的程序

④为库创建头文件

[c]
void bill(char *);
void fred(int);
[/c]

⑤编写主程序program.c,调用库函数

[c]
#include<stdlib.h>
#include"lib.h"
int main(){
bill("hello world");
fred(27);
exit(0);
}
[/c]

⑥编译program

此时还没有打包库,没有用到静态库

只是一个由多源文件组成的程序,可直接编译

gcc -c program.c

gcc -o program program.o bill.o fred.o

编译成功后,运行./program 可以看到程序输出:

bill:hello world

fred:27

⑦创建库文件

用ar将目标文件添加到归档文件 libfoo.a

ar crv libfoo.a bill.o fred.o

⑧使用库编译程序

gcc -o program2 program.o libfoo.a

或gcc -o program3 program.o -L. -lfoo

使用nm命令查看 libfoo.a 中的函数

nm program 显示结果:

bill.o:
0000000000000000 T bill
U printf

fred.o:
0000000000000000 T fred
U printf
 



  1. 這本書挺好的,我用curses劃了個界面就是參考的這本書。這部分內容是哪一章的,我怎麼一點印象也沒有呢。