动态链接库的生成和使用

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

posted on 2024-01-14 12:15  轩邈、  阅读(56)  评论(0编辑  收藏  举报

导航