我试图用我创建的DLL编译我的代码,当我编写./prog
./prog:加载共享库时出错:libctest.so.1:无法打开共享对象文件:没有这样的文件或目录
我跟踪了the tutorial here并且我的mono应用程序在加载dll和调用函数时没有问题。本教程的关键部分是

gcc -Wall -fPIC -c *.c
gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0   *.o
mv libctest.so.1.0 /opt/lib
ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so.1
ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so

我的密码是
[DllImport("path/to/CDLL", CallingConvention = CallingConvention.Cdecl)]
public static extern void test();

我用
gcc -Wall -L/opt/lib main.c -lctest -o prog

这是我改变的第一件事。从prog.c到main.c,我只需运行./prog就可以得到这个问题顶部的错误。我以根用户身份执行此操作,因此不应存在许可问题。我也有755个so。我做错什么了?我是opensuse。我必须创建/opt/lib,所以我认为这条路径没有注册到应该在的位置

最佳答案

默认情况下,动态链接器在尝试解析库依赖项时不会在ld.so中查找。您必须告诉链接器有关非标准库目录的信息,或者将/opt/lib路径添加到您的/opt/lib二进制文件中。

LD_LIBRARY_PATH=/opt/lib ./prog

或者,使用prog链接器选项链接prog。这为链接器在解析共享对象的位置时搜索提供了附加路径。
gcc -Wall -L/opt/lib -Wl,-rpath,/opt/lib main.c -lctest -o prog

可以对二进制文件使用-rpath命令来显示共享库的位置。
ldd prog

这将显示当前无法找到ldd。使用其他搜索路径时,以下命令应显示已解析所有库:
LD_LIBRARY_PATH=/opt/lib ldd prog

09-11 05:16
查看更多