当前位置: 首页 > news >正文

《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文件,它们都包含在可执行程序中。

相关文章:

  • Java中的线程池的线程数量如何确定?
  • Jumpserver堡垒机部署(完整过程)
  • SpringBoot基于AOP实现RocketMQ发送与消费
  • 全球与中国亚麻籽行业消费量调研及未来产销需求分析报告2022-2028年
  • 链接装载与库:第八章——Linux共享库组织
  • java应用提速(速度与激情)
  • Java学习----Set接口
  • To enable Secure Boots and Flash Encryption using the ESP Flash download tool
  • FastFlow(2)---任务调度Task Schedule
  • 根据当前日期获取前一天日期-小工具
  • 金仓数据库KingbaseES客户端应用参考手册--12. sys_dumpall
  • 最详细说明spring cloud和Spring Cloud Alibaba的联系和区别
  • 【0基础学算法】二分查找 (超详细讲解+私人笔记+源码)
  • 计算机网络作业(存储单位k、KB、MB、GB、TB、PB;手机运行内存和内存的区别)
  • 正则表达式 (Regex) 2022教程
  • 【Leetcode】104. 二叉树的最大深度
  • 30天自制操作系统-2
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • iOS | NSProxy
  • JDK9: 集成 Jshell 和 Maven 项目.
  • js递归,无限分级树形折叠菜单
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • PV统计优化设计
  • Python_网络编程
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • 读懂package.json -- 依赖管理
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 排序(1):冒泡排序
  • 区块链分支循环
  • 网页视频流m3u8/ts视频下载
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 如何在招聘中考核.NET架构师
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • #includecmath
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (小白学Java)Java简介和基本配置
  • (转)EXC_BREAKPOINT僵尸错误
  • 、写入Shellcode到注册表上线
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET 8.0 发布到 IIS
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET微信公众号开发-2.0创建自定义菜单
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • :中兴通讯为何成功
  • @angular/cli项目构建--Dynamic.Form
  • @EventListener注解使用说明
  • @RequestMapping处理请求异常
  • [ 数据结构 - C++] AVL树原理及实现