动态链接库so

1.生成链接库

/*func.c*/

#include "stdio.h"

void func(void)
{
    printf("func\n");
}

-fPIC(Position Independent Code)   编译生成代码与位置无关

gcc -fPIC -c func.c -o func.o 

-shared 链接一个共享库so

gcc -shared func.o -o libfunc.so 

2.使用链接库

(1)方式一

/*main.c*/

void func(void);

void main(void)
{
    func();
}

-L: 指定so文件所在的目录。

-l:动态链接库名(即:文件名去除前缀lib,去除后缀.so)。

gcc -o main main.c -L. -lfunc

(2)方式二

gcc -o main main.c libfunc.so

(3)方式三

/*dl_main.c*/

#include 
#include 
#include 

typedef void (*func)(void);

void main(void)
{
    void *dl_handle;
    func func = NULL;

    dl_handle=dlopen("./libfunc.so",RTLD_LAZY);
    if(NULL == dl_handle)
    {
        fprintf(stderr,"%s\n",dlerror());
        exit(-1);
    }

    func = dlsym(dl_handle,"func");
    func();
    dlclose(dl_handle);
    return;
}

-rdynamic 链接选项,指示链接器把所有符号都添加到动态符号表(即.dynsym表)里,以便那些通过dlopen()或backtrace()的函数使用。

gcc -rdynamic -o dl_main dl_main.c -ldl

参考:

关于 gcc/g++编译选项: -fPIC 功能的解释_yyps的博客-CSDN博客

动态库基本原理和使用方法,-fPIC选项的来龙去脉_动态库的原理_learnrocks100的博客-CSDN博客

dlopen_百度百科 (baidu.com)

linux 动态链接库(.so)的生成和引用_linux链接动态库so文件_进击的铁甲小宝的博客-CSDN博客

linux编译时动态链接.so文件_linux把两个so链接_搬砖工13的博客-CSDN博客

Linux 动态链接库(.so)的使用 - 旭东的博客 - 博客园 (cnblogs.com)

Linux-(C/C++)动态链接库生成以及使用(libxxx.so) (taodudu.cc)

gcc选项-g与-rdynamic的异同_460833359的博客-CSDN博客

你可能感兴趣的:(C语言,linux,编程,c语言,linux)