我正在尝试用我制作的DLL编译我的代码,当我写./prog
./ prog:加载共享库时出错:libctest.so.1:无法打开共享对象文件:没有这样的文件或目录
我跟着the tutorial here,我的单声道应用程序加载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
我的C#代码
[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
运行以获得此问题顶部的错误。我以root身份执行此操作,因此不应存在权限问题。我也chmod 755这样的。我究竟做错了什么?这是opensuse。我必须创建/opt/lib
,所以我认为这条路径没有注册到它应该是
答案 0 :(得分:3)
在尝试解析库依赖项时,默认情况下动态链接器ld.so
不会查找/opt/lib
。您必须告诉链接器有关非标准库目录的信息,或者将/opt/lib
路径添加到prog
二进制文件中。
例如
LD_LIBRARY_PATH=/opt/lib ./prog
或链接prog
与-rpath
链接器选项。这为链接器在解析共享对象的位置时提供了一个额外的路径。
gcc -Wall -L/opt/lib -Wl,-rpath,/opt/lib main.c -lctest -o prog
您可以在二进制文件上使用ldd
命令来显示共享库的位置。
ldd prog
目前显示无法找到libctest.so
。使用其他搜索路径,以下命令应显示已解析所有库:
LD_LIBRARY_PATH=/opt/lib ldd prog