我需要动态链接我创建的库。我不确定问题是什么。这一切都正确编译,但我总是将handle
作为NULL
指针捕获:
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);
}
我无法通过此错误,我不确定可能出现的问题。我很确定我已经正确编译了所有内容。以下是我使用的编译步骤:
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。
答案 0 :(得分:17)
在构建hw11-lib-michaelSchilling.so
时,您似乎没有告诉gcc
您想要共享对象(名称中的.so
是不够的。)
使用-c
生成目标文件(不是共享对象)并将其调用michaelSchilling.so
。链接器甚至不会被调用。
从-c
命令行中删除gcc
并添加-shared
:
gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so
答案 1 :(得分:1)
斜杠(/
)作为路径名的第一个字符表示路径名是绝对的(相对于根目录),不是相对于当前工作目录,当然也不是相对于二进制文件的位置。您需要通过确定二进制文件的位置来指定完整路径(这本身并不是一个简单的问题),或者您可以将$ORIGIN
与dlopen
一起使用(它适用于rpath但我不确定它是否适用于dlopen
)。
答案 2 :(得分:0)
hw11-lib-michaelSchilling.so
是否在文件系统的绝对根目录中?你声称它是通过对它进行削减...但我怀疑它不是。
在错误处理中,在您打印的内容中包含dlerror()
的输出,以找出失败的原因。
答案 3 :(得分:0)
gcc -fPIC -shared -rdynamic library.c -o library.o
编译库时,在Linux上适用于我
对于打开它的代码,您需要-ldl