0

我正在尝试使用我制作的 DLL 编译我的代码,当我编写时出现以下错误./prog

./prog:加载共享库时出错:libctest.so.1:无法打开共享对象文件:没有这样的文件或目录

我按照这里的教程进行操作,我的单声道应用程序加载 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 这样的。我究竟做错了什么?这是开放使用。我必须创建,/opt/lib所以我认为这条路径没有在它应该在的地方注册

4

1 回答 1

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
于 2013-03-11T00:10:43.567 回答