快捷搜索:  汽车  科技

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

编译过程中当我们发现自己编译的动态库打开失败时怎么办呢!

idea加载数据库引擎失败(动态库dlopen打开失败怎么办)(1)

首先我们需要抓输出错误的打印,比如说在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这一项。这个时候问题得到了解决。

猜您喜欢: