Родной P / Invoke с Mono на Linux: DllNotFound
Я пытаюсь загрузить некоторые собственные библиотеки linux с помощью mono. Я запустил mono с флагом отладки:
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
есть.
Так моно говорит мне, что его не удалось найти?
следующий код демонстрирует, что делается:
декларации некоторых 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". Теперь mono ищет библиотеку с именем " libavformat.57 "или некоторые связанные имена, такие как" libavformat.57.Итак". Mono выполняет поиск в каталоге исполняющей сборки.
но, ему не удается найти файл, который он ищет (согласно журналу, опубликованному выше). Так почему же?
спасибо!
в отношении
1 ответов
ключ должен был использовать команду
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