2016-04-07 10 views
0

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 
... 
+0

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

+0

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

+0

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

Antwort

0

kehrt Ich bin nicht absolut sicher, wie Mono mit C++ - Code funktioniert, aber ich könnte mir vorstellen, dass Ihr Problem mit C++ - Namensfehlern zusammenhängt. Versuchen Sie, den Code in einen extern C Block zu schreiben.

Versuchen

extern "C" { 
short libhndl(const char *, unsigned short, long, unsigned short *); 
} 

statt.

+0

Leider habe ich nicht die Quelldateien der Bibliothek – MaxTheBenax

Verwandte Themen