前期工作
自制库的代码
不管是先制作动态库还是静态库,都先要编写自制库代码。
#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
然后就能运行了: