IO线程,静态库,动态库

       函数编译之后生成的二进制的集合,系统编译时优先找动态库,其次再寻找静态库。

1、linu下的两种库:静态库(编译时),动态库(运行时)。

2、静态库

        静态库对函数库的链接是放在编译时期(compile time)完成的。

        优点:程序在运行时与函数库再无瓜葛,移植方便

        缺点:浪费空间和资源,因为所有相关的对象文件(object file)与牵涉到的函数(library)被链接合成一个可执行文件(executable file)。库如果升级,那么可执行程序需要重新编译。

静态库编写:

  1. 将需要制作库的文件编译成二进制:gcc xxx.c -c

  2. 将对应的.o文件制作成静态库: ar csr libxxx.a xxx.o

    静态库的库文件命名必须是以lib开头.a结尾
    中间的xxx----->库名
    libxxx.a ---->库文件名
  3. 使用库: gcc main.c -L. -lxxx

3、动态库

        动态库把对一些库函数的链接载入推迟到程序运行的时期(runtime)。

        可以实现进程之间的资源共享。

        将一些程序升级变得简单。

        甚至可以真正做到链接载入完全由程序员在程序代码中控制。

动态链接库的名字形式为 “libxxx.so” 后缀名为 “.so”
针对于实际库文件,每个共享库都有个特殊的名字“soname”。在程序启动后,程序通过这个名字来告诉动态加载器该载入哪个共享库。
在文件系统中,soname仅是一个链接到实际动态库的链接。
对于动态库而言,每个库实际上都有另一个名字给编译器来用。它是一个指向实际库镜像文件的链接文件。这个时候soname是没有版本号的。

动态库编写: 

  1. 以地址无关的形式编译库:gcc -fPIC xxx.c -c(注意头文件的位置-I .跟头文件路径名)

  2. 制作共享库:gcc -shared -o libxxx.so xxx.o

  3. 添加共享库到环境变量的路径:1:将库放到/lib或/usr/lib; 2:修改环境变量LD_LIBRARY_PATH(它只适用与当前shell);3:修改库查找的配置文件(在 /etc/ld.so.conf.d/xxx.conf文件中添加动态库的绝对路径,用ldconfig刷新;

  4. 使用gcc main.c -L. -lxxx

//头文件:maopao.c
/*===============================================
*   文件名称:maopao.h
*   创 建 者:WM
*   创建日期:2023年08月25日
*   描    述:
================================================*/
#ifndef _MAOPAO_H_
#define _MAOPAO_H_
int * show(int *,int);
#endif

//冒泡函数  maopao.c
/*===============================================
*   文件名称:maopao.c
*   创 建 者:WM
*   创建日期:2023年08月25日
*   描    述:
================================================*/
#include
#include"maopao.h"
int * show(int *p,int n)
{
   for (int i = 0; i < 9; i++)
   {
    for (int j = 0; j < 9-i; j++)
    {
        if(p[j]>p[j+1])
        {
            int k=p[j];
            p[j]=p[j+1];
            p[j+1]=k;
        }
    }
   }
   return p;
} 

//mian函数 main.c
/*===============================================
*   文件名称:main.c
*   创 建 者:WM
*   创建日期:2023年08月25日
*   描    述:
================================================*/
#include 
#include"maopao.h"
int main(int argc, char *argv[])
{ 
    int arr[10]={12,3,45,66,7,78,10,298,88,278};
    show(arr,10);
    for (int i = 0; i < 10; i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
} 

你可能感兴趣的:(IO线程,linux)