idea加载数据库引擎失败(动态库dlopen打开失败怎么办)
idea加载数据库引擎失败(动态库dlopen打开失败怎么办){if(handle == NULL)WRITE_FILELOG g_write_log = NULL;void* handle = NULL;handle = dlopen("./liblog.so" RTLD_LAZY);
我们先描述一下功能和现象吧!首先手动实现了一个日志库,日志库的实现下次补充,现在将其编译成一个so。
gcc -c logfile_so.c -fPIC -g --shared -o liblog.so 以后我们是有写日志就直接打开动态库就可以使用了,但是运行使用的时候出现了以下错误:
//函数指针的使用
typedef int (*WRITE_FILELOG)(PRINT_LEVEL level char* file_path char* fmt ...);
WRITE_FILELOG g_write_log = NULL;
void* handle = NULL;
handle = dlopen("./liblog.so" RTLD_LAZY);
if(handle == NULL)
{
printf(" open liblog.so failure\n");
printf("%s\n" dlerror());//定位出dlopen返错的原因
return ERROR;
}
g_write_log = dlsym(handle "write2filelog");
if(g_write_log == NULL)
{
printf("open liblog.so failure\n");
return ERROR;
}
应用函数:gcc 1_highlow.c -llog -L ./ -ldl
编译过程中当我们发现自己编译的动态库打开失败时怎么办呢!
首先我们需要抓输出错误的打印,比如说在handle = dlopen("./liblog.so" RTLD_LAZY) 在if(handle == NULL)时抓一下dlopen失败的原因,加入printf("%s\n" dlerror());这就有了我们看到的./liblog.so:only ET_DYN and ET_EXEC can be loaded 这句打印,这时候我们就需要了解一下打开动态库的参数的意思了,打开的是一个动态的链接,这个时候我们再来看一看我们编译的脚本,gcc logfile_so.c -fPIC -c --shared -o liblog.so,这里面的-c就是导致问题的所在之处,因为-c表示.c编译源文件但是不链接,所以我们编译动态库的时候需要去掉-c这一项。这个时候问题得到了解决。