c# - 在 Linux 上使用 Mono 进行 native P/调用 : DllNotFound

标签 c# linux mono pinvoke

我正在尝试使用 mono 加载一些 native linux 库。 我已经使用调试标志运行单声道:

Mono: DllImport attempting to load: 'libavformat.57'.
Mono: DllImport error loading library '/home/filoe/Desktop/cscore/cscore/Samples/LinuxSample/bin/Debug/libavformat.57': '/home/filoe/Desktop/cscore/cscore/Samples/LinuxSample/bin/Debug/libavformat.57: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library '/home/filoe/Desktop/cscore/cscore/Samples/LinuxSample/bin/Debug/libavformat.57.so': 'libavcodec.so.57: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library '/usr/lib/libavformat.57': '/usr/lib/libavformat.57: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library '/usr/lib/libavformat.57.so': '/usr/lib/libavformat.57.so: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library 'libavformat.57': 'libavformat.57: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library 'libavformat.57.so': 'libavformat.57.so: cannot open shared object file: No such file or directory'.
Mono: DllImport error loading library 'libavformat.57': 'libavformat.57: cannot open shared object file: No such file or directory'.
Mono: DllImport unable to load library 'libavformat.57: cannot open shared object file: No such file or directory'.
Mono: DllImport attempting to load: 'libavformat.57'.

有很多查找位置,但至少其中一个应该匹配。 这是我的目录的样子:

filoe@ubuntu:~/Desktop/cscore/cscore/Samples/LinuxSample/bin/Debug$ dir
CSCore.Ffmpeg.dll     CSCore.Ffmpeg.dll.mdb  CSCore.Linux.dll.config  FFmpeg     libavformat.57  libswresample.2  LinuxSample.exe.mdb
CSCore.Ffmpeg.dll.config  CSCore.Linux.dll   CSCore.Linux.dll.mdb     libavcodec.57  libavutil.55    LinuxSample.exe  log.txt
filoe@ubuntu:~/Desktop/cscore/cscore/Samples/LinuxSample/bin/Debug$ 

如您所见,libavformat.57 就在那里。 那么mono是否告诉我找不到它?

以下代码演示了完成的操作:

一些DllImport方法的声明:

[DllImport("avformat-57", EntryPoint = "av_register_all", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal static extern void av_register_all();
[DllImport("avcodec-57", EntryPoint = "avcodec_register_all", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal static extern void avcodec_register_all();

该项目还包含一个名为“{输出程序集的名称}.config”的文件:

<configuration>
  <dllmap os="linux" dll="avcodec-57" target="libavcodec.57"/>
  <dllmap os="linux" dll="avformat-57" target="libavformat.57"/>
</configuration>

如您所见,映射工作正常。 Mono 采用“avformat-57”并将其转换为“libavformat.57”。 现在单声道搜索名称为“libavformat.57”或一些相关名称(如“libavformat.57.so”)的库。 Mono 在执行程序集的目录中搜索。

但是,它无法找到它正在寻找的文件(根据上面发布的日志)。那为什么?

谢谢!

问候

最佳答案

关键是使用命令

ldd libavformat.57

输出如下:

linux-vdso.so.1 =>  (0x00007ffdf9bd6000)
libavcodec.so.57 => not found
libavutil.so.55 => not found
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4a74652000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f4a74439000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4a7421b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4a73e56000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4a74d73000)

所以我将其重命名为建议的名称并再次尝试但没有成功。 下一次尝试

LD_LIBRARY_PATH=./ ldd libavformat.so.57

成功了。我已经调整了配置文件,现在我可以使用

启动应用程序
LD_LIBRARY_PATH=./ mono MyApp.exe

关于c# - 在 Linux 上使用 Mono 进行 native P/调用 : DllNotFound,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41089603/

相关文章:

C# 以编程方式恢复 NuGet 包

c# - JSON.NET MVC 4 WebApi

C# linq to json 如何读取数组中的属性值

linux - 尝试安装其他软件包时Nginx出现问题

c# - 无法从 docker 运行 asp.net 5

linux - 如何使用 awk regExp 进行多重模式检查并以 Excel 格式打印

linux - 无法从 SSH 启动 MonoGame,但可以从 GUI 启动

c# - 我应该如何从在 Linux 中的单声道上运行的 C# 应用程序访问 Active Directory?

c# - 数据库中的某些数据更改。我怎样才能触发一些 C# 代码对这些更改做一些工作?

c# - raspbian 上的单一服务 WCF 选项