动态链接库的生成和使用
1、当前目录 /home/xuanmiao/Demo/LSPT/Test 创建文件prime.h和prime.c
prime.h
int isprime(long int number);
prime.c
int isprime(long int number) { long int j; int prime = 1; /* Test if the number is divisible, starting from 2 */ for(j=2; j<number; j++) { /* Use the modulo operator to test if the * number is evenly divisible, i.e., a * prime number */ if(number%j == 0) { prime = 0; } } if(prime == 1) { return 1; } else { return 0; } }
2、当前目录 /home/xuanmiao/Demo/LSPT/Test 根据prime.c编译生成目标文件prime.o
gcc -Wall -Wextra -pedantic -fPIC -c prime.c
-Wall
:这是gcc编译器的一个选项,它告诉编译器输出所有可能的警告信息。
-Wextra
:这个选项使gcc产生一些额外的警告,这些警告超出了-Wall选项产生的警告。
-pedantic
:这个选项告诉gcc,要遵守所有的ISO C和ISO C++标准。
-fPIC
:这个选项生成位置无关代码(Position Independent Code),这样的代码可以在任何地方执行,而不会受到自身所在内存位置的影响。\n- -c
:这个选项告诉gcc编译或汇编源文件,但不要链接。
prime.c
:这是你要编译的C源文件。
3、当前目录 /home/xuanmiao/Demo/LSPT/Test 根据目标文件prime.o生成动态链接库libprime.so
gcc -shared -Wl, soname, libprime.so -o libprime.so prime.o
这条 gcc
命令用于生成一个名为 libprime.so
的共享库(在类 Unix 系统中,共享库通常具有 .so
扩展名),并且指定了库的 soname。下面是命令各部分的详细说明:
gcc
:GNU 编译器集合中的 C/C++ 编译器。-shared
:指示gcc
生成共享库而不是可执行文件。-Wl,soname,libprime.so
:这是一个传递给链接器的选项,-Wl
表示后面跟随的是链接器选项。soname
是共享库的“版本无关名称”,它允许共享库在不改变程序链接的情况下升级。在这个例子中,libprime.so
就是指定的 soname。-o libprime.so
:指定输出文件的名称,这里是生成的共享库的名称。prime.o
:是要被链接的对象文件,它是编译器处理源代码后生成的中间文件。
这个命令的作用是将 prime.o
对象文件链接成一个共享库 libprime.so
,并且设置其 soname 为 libprime.so
。这样做的好处是,即使将来你更新了共享库并更改了其版本号(例如,从 libprime.so
变为 libprime.so.1
),只要 soname 保持不变,已经链接了这个库的程序就不需要重新链接。
4、当前目录 /home/xuanmiao/Demo/LSPT/Test 编辑调用函数
is-it-a-prime.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "prime.h" int main(int argc, char *argv[]) { long int num; /* Only one argument is accepted */ if (argc != 2) { fprintf(stderr, "Usage: %s number\n", argv[0]); return 1; } /* Only numbers 0-9 are accepted */ if ( strspn(argv[1], "0123456789") != strlen(argv[1]) ) { fprintf(stderr, "Only numeric values are " "accepted\n"); return 1; } num = atol(argv[1]); /* String to long */ if (isprime(num)) /* Check if num is a prime */ { printf("%ld is a prime\n", num); } else { printf("%ld is not a prime\n", num); } return 0; }
5、当前目录 /home/xuanmiao/Demo/LSPT/Test 编译is-it-a-prime.c 源文件
gcc -L${PWD} is-it-a-prime.c -o is-it-a-prime -lprime
这条命令是在使用GCC编译器编译并链接一个C语言源文件(is-it-a-prime.c),同时链接到一个名为libprime的库。
这里的各个参数的含义如下:
-L${PWD}
:这个选项告诉gcc在哪里查找库文件,PWD表示当前目录。
is-it-a-prime.c
:这是你要编译的源文件。
-o is-it-a-prime
:这个选项指定了输出文件的名字。
-lprime
:这个选项告诉gcc链接到名为libprime的库。
6、设置环境变量$LD_LIBRARY_PATH为当前目录
export LD_LIBRARY_PATH=PWD:{PWD}:{LD_LIBRARY_PATH}
7、例如下面文件interest.c中使用了pow函数,这个函数来自标准库中的math库libm,在ubuntu中在/usr/lib/x86_64-linux-gnu目录下
interest.c
#include <stdio.h> #include <math.h> int main(void) { int years = 15; /* The number of years you will * keep the money in the bank * account */ int savings = 99000; /* The inital amount */ float interest = 1.5; /* The interest in % */ printf("The total savings after %d years " "is %.2f\n", years, savings * pow(1+(interest/100), years)); return 0; }
xuanmiao@linux:/usr/lib/x86_64-linux-gnu$ pwd /usr/lib/x86_64-linux-gnu xuanmiao@linux:/usr/lib/x86_64-linux-gnu$ ls | grep [libm.so](http://libm.so) [libm.so](http://libm.so) libm.so.6
在编译interest.c时需要指定libm库:gcc interest.c -o interest -lm
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本