简介
由于linux系统应用程序加载动态库时,动态库(.so)文件可以放到系统的任何地方。而动态库内部并不知道自己所在的文件系统路径。如果需要获取动态库(.so)文件的系统绝对路径,需要采用一些方法。
在windows操作系统中,有微软实现好了的GetModuleFileName系统API, 可以直接调用。
windows下的定义如下:
DWORD GetModuleFileNameA(
[in, optional] HMODULE hModule,
[out] LPSTR lpFilename,
[in] DWORD nSize
);
在linux操作系统中,并没有实现好的任何系统API直接获取动态库(.so)文件的路径,需要自己动手实现。
函数的定义及实现方法如下:
函数
#include <link.h>
#include <dlfcn.h>
int GetModuleFileName(char *pathbuf, int buflen)
{
int ret;
void *address;
address = (void*)(&GetModuleFileName);
if((pathbuf == NULL) || (buflen <=0))
return -1;
Dl_info dl_info;
dl_info.dli_fname = 0;
ret = dladdr(address, &dl_info);
if (0 != ret && dl_info.dli_fname != NULL) {
if(strlen(dl_info.dli_fname) >= buflen) {
return -2;
}
strcpy(pathbuf, dl_info.dli_fname);
return 0;
}
return -3;
}
使用方法
char *pos;
char szModulePath[260];
if(0 == GetModuleFileName(szModulePath, 260)) {
//szModulePath 就是.so文件的绝对路径。
}
编译时,需要在gcc编译参数中加入:-D_GNU_SOURCE 选项。