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


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

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

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

    创建静态库

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

    /*print_num.c*/
    #include 
    
    void print_num(int arg)
    {
    	printf("the number is :%d", arg);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    /*print-string.c*/
    #include 
    
    void print_string(char *arg)
    {
    	printf("the string is :%s", arg);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    首先生成目标文件

    gcc -c print_num.c print_string.c
    
    • 1

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

    ar arv libprint.a print_num.o print_string.o
    
    • 1

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

    ranlib libprint.a
    
    • 1

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

    gcc -o main main.c libprint.a
    
    • 1

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

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

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

  • 相关阅读:
    LLM优化:开源星火13B显卡及内存占用优化
    Mybatis二级缓存
    奇迹mu 架设过程中可能会出现的问题及解决办法
    设计模式-单一职责原则
    Redis常用数据结构操作与底层原理
    循环登录提示“您为登录或者认证已过期,请重新登录”
    sass安装步骤、概述、基本语法等
    CentOS、银河麒麟高级服务器版V10安装mysql5.7
    数据化运营13 工具与方法:如何运用 3A3R 模型将数据转化为运营策略
    vue3transition过渡组件
  • 原文地址:https://blog.csdn.net/qq_51470638/article/details/126644678