首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用libdl和动态链接库

正确使用libdl和动态链接库
EN

Stack Overflow用户
提问于 2011-12-03 20:17:14
回答 4查看 16.4K关注 0票数 16

我需要动态链接我创建的库。我不太清楚这是什么问题。所有这些都正确编译,但我总是将handle捕获为NULL指针:

代码语言:javascript
复制
void *handle;
char *error;
handle = dlopen ("./hw11-lib-michaelSchilling.so", RTLD_LAZY);
//same error comes up with full path as well as './hw11...'
if(!handle){
    error = dlerror();
    printf("%s\n", error);
    printf("Error loading library.\n");
    exit(1);
}

我不能通过这个错误,我不知道什么可能是错的。我很确定我把所有的东西都编译好了。下面是我使用的编译步骤:

代码语言:javascript
复制
gcc -rdynamic -c hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so
gcc hw11-michaelSchilling-4.c -ldl -o hw11-michaelSchilling-4

我收到了一个错误

只能加载ET_DYN和ET_EXEC。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-03 22:15:52

在构建hw11-lib-michaelSchilling.so时,您似乎没有告诉gcc您需要一个共享对象(名称中的.so是不够的)。

使用-c,它将生成一个对象文件(而不是共享对象),并将其称为michaelSchilling.so。链接器甚至不会被调用。

-c命令行中删除gcc并添加-shared

代码语言:javascript
复制
gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so
票数 27
EN

Stack Overflow用户

发布于 2011-12-03 21:52:09

斜杠(/)作为路径名的第一个字符表示路径名是绝对的(相对于根目录),而不是相对于当前工作目录,当然也不相对于二进制文件的位置。您需要通过计算二进制文件的位置来指定完整的路径(这本身并不容易),或者您可以在$ORIGIN中使用dlopen (它适用于rpath,但我不确定它是否适用于dlopen)。

票数 1
EN

Stack Overflow用户

发布于 2017-10-01 17:13:09

代码语言:javascript
复制
gcc -fPIC -shared -rdynamic  library.c -o library.o

在Linux上为打开它的代码编译库时,您需要-ldl

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8370670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档