我正在尝试使用mono加载一些本机linux库。 我用debugging标志运行单声道:
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'.
有很多的查找位置,但至less有一个应该匹配。 这是我的目录是这样的:
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
在那里。 那么,单声道告诉我,它不能被发现?
以下代码演示了所做的事情:
一些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>
正如你在上面看到的,映射工作正常。 单声道需要“avformat-57”并将其转换为“libavformat.57”。 现在单声道search名为“libavformat.57”的库或一些相关的名称,如“libavformat.57.so”。 单声道在执行程序集的目录中进行search。
但是,它不能find它正在寻找的文件(根据上面公布的日志)。 所以为什么?
谢谢!
问候
关键是要使用命令
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