LINUX C/C++ 动态 载入/引用 函式库/函数库(so/dll)「linux_C_so_project」
资料来源: https://codertw.com/程式语言/430351/
GITHUB:https://github.com/jash-git/linux_C_so_project
01.LIB_CODE (caculate.c)
#includeint add(int a,int b) { return (a + b); } int sub(int a, int b) { return (a - b); } int mul(int a, int b) { return (a * b); } int div(int a, int b) { return (a / b); }
02.EXE_CODE (test_so.c)
#include#include #include //动态连结库路径 #define LIB_CACULATE_PATH "./libcaculate.so" //函式指标 typedef int (*CAC_FUNC)(int, int); int main() { void *handle; char *error; CAC_FUNC cac_func = NULL; //开启动态连结库 handle = dlopen(LIB_CACULATE_PATH, RTLD_LAZY); if (!handle) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } //清除之前存在的错误 dlerror(); //获取一个函式 *(void **) (&cac_func) = dlsym(handle, "add"); if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); exit(EXIT_FAILURE); } printf("add: %d\n", (*cac_func)(2,7)); cac_func = (CAC_FUNC)dlsym(handle, "sub"); printf("sub: %d\n", cac_func(9,2)); cac_func = (CAC_FUNC)dlsym(handle, "mul"); printf("mul: %d\n", cac_func(3,2)); cac_func = (CAC_FUNC)dlsym(handle, "div"); printf("div: %d\n", cac_func(8,2)); //关闭动态连结库 dlclose(handle); exit(EXIT_SUCCESS); }
03.编译so
gcc -fPIC -shared caculate.c -o libcaculate.so
04.编译执行档
gcc -rdynamic -o main test_so.c -ldl