LINUX C语言:程序运行时动态加载库函数

来源:互联网 发布:vscode visual studio 编辑:程序博客网 时间:2024/05/26 15:57

PS:相关知识请自己去看man手册,这里只给出一个实例,及创建这个实例的步骤。


1:创建test.h, test.c文件

//test.h#ifndef TEST_H_#define TEST_H_#include <stdio.h>void PrintHello();int Add(int a, int b);#endif


//test.cpp#include "test.h"//输出文本hello, worldvoid Hello(){printf("hello, world\n");}//返回两个参数的和int Add(int a, int b){return a + b;}


2:将其编译成动态库
gcc test.c -shared -fPIC -o libtest.so

3:创建主文件main.c

//main.c#include <stdio.h>#include <stdlib.h>#include <dlfcn.h>#include <signal.h>#include <errno.h>//输出错误信息并退出      void error_quit(const char *str)      {      fprintf(stderr, "%s\n", str);   exit(1);      }  int main(int argc, char *argv []){void *plib;//指向so文件的指针typedef void (*FUN_HELLO)();typedef int (*FUN_ADD)(int, int);FUN_HELLO funHello = NULL;//函数指针FUN_ADD funAdd = NULL;//打开so文件//为了方便演示,我将库文件和可执行文件放在同一个目录下plib = dlopen("./libtest.so", RTLD_NOW | RTLD_GLOBAL);if( NULL == plib )error_quit("Can't open the libtest.so");//加载函数void Hello()funHello = dlsym(plib, "Hello");if( NULL == funHello )error_quit("Can't load function 'Hello'");//加载函数int Add(int a, int b)funAdd = dlsym(plib, "Add");if( NULL == funAdd )error_quit("Can't load function 'Add'");//调用成功加载的函数funHello();printf("5 + 8 = %d\n", funAdd(5, 8));//关闭so文件dlclose(plib);return 0;}


4:编译,运行

gcc main.c -o main -ldl./main

完成了,呵呵

原创粉丝点击