歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux下使用動態鏈接庫

Linux下使用動態鏈接庫

日期:2017/3/1 10:01:06   编辑:Linux編程

Linux下使用動態鏈接庫

方法一:使用dlopen打開庫並使用dlsym調用動態庫中函數

dll.c文件

#include <stdio.h>
#include <dlfcn.h

int main()
{
void *libc = NULL;
void (*dll_x_printf)(char *str) = NULL;
char *err;

/* directly used function in libprintf.so, because we had linked */
//x_printf("direct used printf");

libc = dlopen("/home/wei.xuan/study/dll/libprintf.so", RTLD_NOW);
if (NULL != libc)
{
dll_x_printf = dlsym(libc, "x_printf");
if (NULL == dll_x_printf)
{
printf("can't find x_printf\n");
}
else
{
(*dll_x_printf)("hello, world\n")
}
dlclose(libc);
}
else
{
err = dlerror();
printf("libprintf.so failed! [%s]\n", err);
printf("open libprintf.so failed\n");
}
return 0;
}

libdll.c

#include <stdio.h>

void x_printf(char *str)
{
if (NULL == str)
{
printf("string is null\n");
}
else
{
printf("%s\n", str);
}
return;
}

makefile

dll:dll.o libprintf.so
gcc -o dll dll.o -rdynamic -L. -ldl
dll.o:dll.c
gcc -c dll.c
libprintf.so:
gcc libdll.c -fPIC -shared -o libprintf.so
clean:
rm dll dll.o libprintf.so

三個文件dll.c的main函數調用libdll.c生成的so文件。

首先使用dlopen打開so庫獲取句柄,然後根據句柄調用dlsym獲取想使用函數的地址,最後調用該函數。

這種方法在編譯時不需要鏈接libprintf.so

方法二:編譯時鏈接動態庫

將makefile文件的dll:dll.o liprintf.so的指令該為

gcc -o dll dll.o -rdynmaic -L. -ldl -lprintf

如果makefile這麼修改,則可在main中直接調用x_printf,即dll.c函數中注釋部分。

Copyright © Linux教程網 All Rights Reserved