《linux程序设计》笔记第一章

linux存储系统程序的标准路径
  • /bin:二进制文件目录,用于存放启动系统时用到的程序。
  • /usr/bin: 用户二进制文件目录,用于存放用户使用的标准程序。
  • /usr/local/bin: 本地二进制文件目录,用于存放软件安装的程序。

系统管理员(例如root用户)登录后使用的PATH变量还可能包含存放系统管理程序的目录,如/sbin和/usr/sbin。

可选的操作系统组件和第三方应用程序可能被安装在/opt目录下,安装程序可以通过用户安装脚本将路径添加到环境变量中。

创建静态库

假设自定义的库文件为print_num.c、print_string.c

/*print_num.c*/
#include <stdio.h>

void print_num(int arg)
{
	printf("the number is :%d", arg);
}

/*print-string.c*/
#include <stdio.h>

void print_string(char *arg)
{
	printf("the string is :%s", arg);
}

首先生成目标文件

gcc -c print_num.c print_string.c

用ar将目标文件归档为一个文件,注意,按照管理,文件命名都以.a结尾,且以lib开头。使用时,如lm会搜索libm.a,。

ar arv libprint.a print_num.o print_string.o

接下来,在某些系统(尤其是Berkeley UNIX衍生来的)中需要为函数库生成一个内容表,通过ranlib命令来完成。

ranlib libprint.a

在linux中,对于GNU的软件开发工具,这一步骤非必须,但也无妨。
下来可以使用该函数库:

gcc -o main main.c libprint.a

也可以使用-l选项来访问函数库,但因其未保存在标准位置,所以必须使用-L选项来告诉编译器在何处可以找到它:

gcc -o main main.c -L. -lprint

可以使用nm命令查看哪些函数被包含在目标文件、函数库、可执行文件中。

当程序被创建时,它只包含函数库中它实际需要的函数,虽然程序中的头文件包含函数库中所有函数的声明,但这并不会将整个函数库包含在最终的程序中。

共享库

共享库的保存位置与静态库是一样的,但共享库有不同的文件名后缀。在一个典型的linux系统中,标准数学库的共享版本是/usr/lib/libm.so。

当一个程序使用共享库时,它的链接方式是这样的:程序本身不再包含函数代码,而是引用运行时可访问的共享代码。当编译好的程序被装载到内存中执行时,函数引用被解析,并产生对共享库的调用,如果有必要,共享库才被加载到内存中。

通过这种方法,系统可以只保留共享库的一份副本供许多应用程序同时使用,并且在磁盘上也仅保存一份。

另一个好处是共享库的更新可以独立于依赖它的应用程序。

例如,文件/lib/libm.so就是对实际库文件修订版本(/lib/libm.so.N,其中N代表主版本号 )的符号链接。

当linux启动应用程序时,它会考虑应用程序需要的函数库版本,以防止函数库的新版本致使旧的应用程序不能使用。

对linux系统来说,负责装载共享库并解析客户程序函数引用的程序(动态装载器)是ld.so , 也可能是 ld-linux.so.2、ld-lsb.so.2或ld-lsb.so.3。用于搜索共享库的额外位置可以在文件/etc/ld.so.conf中配置。如果修改了这个文件,你需要执行命令ldconfig来处理它。

可以通过ldd工具来查看一个程序需要的共享库。例如,如果你在自己的实例程序上运行ldd。

共享库在许多方面类似于windows中使用的动态链接库,.so库对应于.DLL文件,它们都是在程序运行时加载,而.a类似于.LIB文件,它们都包含在可执行程序中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

barbyQAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值