我需要动态链接我创建的库。我不太清楚这是什么问题。所有这些都正确编译,但我总是将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。
发布于 2011-12-03 22:15:52
在构建hw11-lib-michaelSchilling.so时,您似乎没有告诉gcc您需要一个共享对象(名称中的.so是不够的)。
使用-c,它将生成一个对象文件(而不是共享对象),并将其称为michaelSchilling.so。链接器甚至不会被调用。
从-c命令行中删除gcc并添加-shared
gcc -shared -rdynamic hw11-lib-michaelSchilling.c -o hw11-lib-michaelSchilling.so发布于 2011-12-03 21:52:09
斜杠(/)作为路径名的第一个字符表示路径名是绝对的(相对于根目录),而不是相对于当前工作目录,当然也不相对于二进制文件的位置。您需要通过计算二进制文件的位置来指定完整的路径(这本身并不容易),或者您可以在$ORIGIN中使用dlopen (它适用于rpath,但我不确定它是否适用于dlopen)。
发布于 2017-10-01 17:13:09
gcc -fPIC -shared -rdynamic library.c -o library.o在Linux上为打开它的代码编译库时,您需要-ldl。
https://stackoverflow.com/questions/8370670
复制相似问题