C语言 动、静态库的制作和使用

前期工作

 自制库的代码

  不管是先制作动态库还是静态库,都先要编写自制库代码。

#include <stdio.h>

/**
 * @brief 递归函数 fun1
 *
 * @param number 初始数值
 * @param sum 当前累加和
 * @return int 最终累加和
 */
int fun1(int number, int sum)
{
    if (number == 0)
        return sum;
    return fun1(--number, sum += number);
}

 主函数

#include <stdio.h>

int fun1(int number, int sum);

int main(int argc, char const *argv[])
{
    int number;
    printf("请输入一个整数:");
    scanf("%d", &number);
    printf("最终的结果为:%d\n", fun1(number, 0));

    return 0;
}

  在完成上述前期工作后,就可以制作动、静态库了。

1、静态库,静态编译

  第一步:先生成".o"文件。值得注意的是,所有的库文件都是从".o"文件中生成的。
  第二步:使用ar工具将".o"文件编译成".a"文件。其命令为:

ar rcs lib静态库文件名.a 生成的.o文件名.o

  ar工具中,有rcs参数,它们的作用分别如下:

  • r(replace):该参数用于替换归档文件中的成员(member)。如果归档文件中已存在同名的成员,将会被新的成员取代;如果不存在同名的成员,则将新成员添加到归档文件中。
  • c(create):该参数用于创建归档文件。如果指定的归档文件不存在,则会创建一个新的归档文件;如果指定的归档文件已存在,则会在归档文件的末尾添加新的成员。
  • s(symbol table):该参数用于创建或更新归档文件中的符号表。符号表记录了归档文件中每个成员的全局符号信息。这些符号信息在链接时用于解析符号引用,以确保符号的唯一性和一致性。
      综合使用这三个参数(rcs)可以进行创建、替换和更新归档文件中的成员,并且同时更新符号表。

  第三步:将调用库的".c"文件和".a"文件一起生成程序。

将二者链接时,切记写有mian函数的.c文件在前,.a文件在后!
gcc main.c libfile1.a -o main

  第四步:执行程序。

  下面是在Linux中进行实验的例子:
在这里插入图片描述

2、动态库,动态编译

  第一步:先将自制库的.c文件给编译生".o"文件。在这步中,使用的命令为:

gcc -fPIC -c 自制库文件名.c -o 自制库文件名.o

  参数解释:-fPIC(Position Independent Code):这个参数用于编译生成位置无关代码。它主要用于编译动态链接库(shared library),确保代码可以在内存中的任意位置执行。动态链接库可以被多个程序共享,因此需要能够在不同的内存地址加载和执行。

  第二步:将".o"文件给编译生成".so"文件,相关命令为:

gcc -shared “.o"文件名.o -o lib”.o"文件名.so

  参数解释:-shared参数用于编译生成动态链接库.它告诉GCC编译器将目标文件链接成一个动态链接库文件,以便在运行时可以被其他程序加载和使用。

  第三步:动态链接编译,相关命令为:

gcc 主函数文件名.c -o 可执行程序名 -L. -l库名

  在Linux上的运行结果:
在这里插入图片描述
  如果发生下面这种情况:
在这里插入图片描述
  那么需要设置系统的动态库环境变量:

sudo gedit ~/.bashrc

在这里插入图片描述
在打开的文件中最底下添加一行内容:

export LD_LIBRARY_PATH=/mnt/hgfs/003VMSF/CLanguage/020self/newfile/:$LD_LIBRARY_PATH

/mnt/hgfs/003VMSF/CLanguage/020self/newfile/为动态库所在路径,需要自己添加

在这里插入图片描述
填完完毕,记得保存,然后使用下面这条命令:

source ~/.bashrc

然后就能运行了:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值