欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux 下动态链接库so

程序员文章站 2022-05-12 23:40:17
...

Linux 下动态链接库(shared object file,共享对象文件)的文件后缀为.so,它是一种特殊的目标文件(object file),可以在程序运行时被加载(链接)进来。使用动态链接库的优点是:程序的可执行文件更小,便于程序的模块化以及更新,同时,有效内存的使用效率更高。

GCC 生成动态链接库
如果想创建一个动态链接库,可以使用 GCC 的-shared选项。输入文件可以是源文件、汇编文件或者目标文件。

另外还得结合-fPIC选项。-fPIC 选项作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code);这样一来,产生的代码中就没有绝对地址了,全部使用相对地址,所以代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。

例如,从源文件生成动态链接库:

$ gcc -fPIC -shared max.c -o libmax.so
从目标文件生成动态链接库:

$ gcc -fPIC -c nax.c -o max.o
$ gcc -shared max.o -o libmax.so
-fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。

GCC 将动态链接库链接到可执行文件
如果希望将一个动态链接库链接到可执行文件,那么需要在命令行中列出动态链接库的名称,具体方式和普通的源文件、目标文件一样。请看下面的例子:

$ gcc text.c libmax.so -o text
将 text.c 和 limax.so 一起编译成 text,当 text 运行时,会动态地加载链接库 libmax.so。

当然,必须要确保程序在运行时可以找到这个动态链接库。你可以将链接库放到标准目录下,例如 /usr/lib,或者设置一个合适的环境变量,例如 LIBRARY_PATH。不同系统,具有不同的加载链接库的方法。(个人使用的是ubantu——kylin的操作系统,执行完上面的操作的时候自己的动态链接库so文件是放在当前目录下的,不需要放到usr/lib目录或者其他目录下就可以找到)

用例代码如下
max.h

#ifndef __MAX_H__
#define __MAX_H__

#ifdef __cplusplus
extern "C"  //C++
{
#endif
int max(int n1, int n2, int n3);
#ifdef __cplusplus
}
#endif

#endif

max.c

int max(int n1, int n2, int n3)
{ 
    int max_num = n1;
    max_num = max_num < n2? n2: max_num;
    max_num = max_num < n3? n3: max_num;
    return max_num;
}

text.c

#include <stdio.h>
#include "max.h"

int main(int argc, char *argv[])
{
    int a = 10, b = -2, c = 100;
    printf("max among 10, -2 and 100 is %d.\n", max(a, b, c));
    return 0;
}