Ich habe eine C++ - Bibliothek libmylib32.so für Linux Ubuntu 32bit kompiliert.monodevelop System.DllNotFoundException Aufruf einer Funktion in einer C++ - Bibliothek
Die Bibliothek ist in usr/local/lib und ich bestätigte, dass es in einem C++ - Programm arbeitet.
In der Datei/etc/mono/config hinzugefügt I
<dllmap dll="mylib32.dll" target="/usr/local/lib/libmylib32.so"/>
und ich habe auch versucht, mit
<dllmap dll="mylib32.dll" target="/usr/local/lib/libmylib32.so" os="!windows"/>
ich ein C# Programm mit monodevelop schrieb die C++ Funktion aufzurufen:
short libhndl(const char *, unsigned short, long, unsigned short *);
Zuerst schrieb ich eine Klasse, wo die Schnittstelle der Funktion erklärt wird:
public class MyClass
{
[global::System.Runtime.InteropServices.DllImport("mylib32.dll", EntryPoint="libhndl", CharSet = CharSet.Ansi)]
public static extern short libhndl([MarshalAs(UnmanagedType.LPStr)] string ip, ushort port,int timeout, out ushort libHndl);
}
Das Hauptprogramm ruft die Funktion libhndl:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Diagnostics;
using System.Runtime.InteropServices;
public class main_program
{
// ...
ret = MyClass.libhndl(ip_address, tcp_port, tcp_timeout, out m_libHndl);
//...
}
Wenn ich das Programm debuggen, wenn die fucntion genannt wird bekomme ich die Ausnahme:
System.DllNotFoundException: /usr/local/lib/libmylib32.so
at (wrapper managed-to-native) MyClass:libhndl (string,uint16,int,uint16&)
at main_program.function() [0x00056] in
/home/f90100027/workspace/Ex_mono/Ex_mono/main_program.cs:306
at System.Threading.Thread.StartInternal() [0x00000] in <filename unknown>:0
Die Bibliothek erscheint das finden Bibliothek, weil die Ausnahme den vollständigen Bibliothekspfad anzeigt.
Kann jemand erklären, wo das Problem sein könnte, bitte?
Vielen Dank im Voraus für Ihre Hilfe.
den Rat der env var MONO_LOG_LEVEL = debug der Debugger liefert
Mono: DllImport error loading library 'libmylib32.so': '/usr/local/lib/libmylib32.so: undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE'.
Der Befehl nm einzustellen Nach /usr/local/lib/libmylib32.so
...
000144c0 T libhndl
...
0013ee30 V _ZTV9SocketMgr
U _ZTVN10__cxxabiv117__class_type_infoE
...
1) Setze die env-Variable 'MONO_LOG_LEVEL = debug ', um einen ** sehr detaillierten ** Dump zu erhalten, wo genau Mono sucht, um diese gemeinsame Bibliothek zu finden und was wirklich fehlschlägt. 2) Überspringe die dllmap und benutze LD_LIBRARY_PATH, um Mono mitzuteilen, wo es gesucht werden soll, d. H. 'Export LD_LIBRARY_PATH =/usr/local/lib: $ LD_LIBRARY_PATH Diese sollten mehr Informationen erhalten, um die Reparatur zu reparieren oder mehr Informationen für uns zu helfen. – SushiHangover
Ich bekomme ein undefiniertes Symbol, das ich nicht verstehen kann. Mono: DllImport Fehler beim Laden der Bibliothek 'libmylib32.so': '/usr/local/lib/libmylib32.so: undefiniertes Symbol: _ZTVN10__cxxabiv117__class_type_infoE'. – MaxTheBenax
Scheint, C++ - Namensverwaltung zu sein, diese C++ - Routinen müssen als 'extern' C 'markiert werden, ich sehe Ihre anderen Commit, dass Sie nicht die Quelle haben ... Sie könnten eine andere C++ basierte Bibliothek erstellen, um diese Aufrufe zu umbrechen das "externe" C "". Siehe http://www.mono-project.com/docs/advanced/pinvoke/ für weitere Informationen über die ABI Calling Interface erforderlich – SushiHangover