无法在linux gcc中加载dll

时间:2013-03-11 00:05:00

标签: c linux gcc

我正在尝试用我制作的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,所以我认为这条路径没有注册到它应该是

1 个答案:

答案 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