2016-12-11 18 views
6

Próbuję załadować niektóre natywne biblioteki linuksowe przy użyciu mono. Zabrakło mi mono z flagą debugowania:Natywne P/Wywołanie z Mono w systemie Linux: DllNotFound

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'. 

Istnieje wiele stanowisk odnośników, ale przynajmniej jeden z nich powinien pasować. ten sposób mój katalog wygląda następująco:

[email protected]:~/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 
[email protected]:~/Desktop/cscore/cscore/Samples/LinuxSample/bin/Debug$ 

Jak widać, libavformat.57 ma. Więc mono mówi mi, że nie można go znaleźć?

Poniższy kod demonstruje, co zostało zrobione:

Deklarację niektórych DllImport metod:

[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(); 

Projekt zawiera również plik o nazwie „{nazwa zespołu wyjściowego} .config ":

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

Jak widać powyżej, mapowanie działa dobrze. Mono przyjmuje "avformat-57" i tłumaczy go na "libavformat.57". Teraz mono szuka biblioteki o nazwie "libavformat.57" lub kilku podobnych nazw, takich jak "libavformat.57.so". Mono wyszukuje w katalogu zespołu wykonującego.

Ale nie jest w stanie znaleźć pliku, którego szuka (zgodnie z dziennikiem zamieszczonym powyżej). Więc dlaczego?

Dzięki!

Pozdrowienia

+0

współdzielone biblioteki mają '.so' rozszerzenia, to nie jest poprawnie zbierając bibliotekę, spróbuj zmienić go i ponownie odwołanie do wspólnej biblioteki? – t0mm13b

+0

Nie, nie określa, które rozszerzenia lub kombinacje nazw plików, których używam. Komunikat o błędzie mówi, że plik, który zdecydowanie istnieje, nie może zostać znaleziony przez mono. –

+0

pokaż nam [MCVE], aby to pokazać. – t0mm13b

Odpowiedz

2

Kluczem było użyć polecenia

ldd libavformat.57 

Z następujące dane wyjściowe:

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) 

Więc ja przemianowano go do proponowanych nazw i próbował go ponownie nie powodzenie. Następna próba z użyciem

LD_LIBRARY_PATH=./ ldd libavformat.so.57 

Powodzenie. Mam dostosować plik konfiguracyjny, a teraz jestem w stanie uruchomić aplikację z

LD_LIBRARY_PATH=./ mono MyApp.exe 
+0

Po prostu ciekawy, dlaczego nie zainstalować libavformat przy użyciu menedżera pakietów Ubuntu? – Matt

+0

Co ciekawe, dokładnie to powiedziałam w swoim komentarzu;) –

Powiązane problemy