2016-04-07 9 views
0

Linux Ubuntu 32bit用にコンパイルされたC++ライブラリlibmylib32.soがあります。monodevelop System.DllNotFoundException C++ライブラリで関数を呼び出す

ライブラリはusr/local/libにあり、C++プログラムで動作していることを確認しました。ファイルで

の/ etc /モノ/ configに私は

<dllmap dll="mylib32.dll" target="/usr/local/lib/libmylib32.so"/> 

を追加し、また、私はC++の関数を呼び出すためにMonoDevelopとC#のプログラムを書いた

<dllmap dll="mylib32.dll" target="/usr/local/lib/libmylib32.so" os="!windows"/> 

で試してみました:

short libhndl(const char *, unsigned short, long, unsigned short *); 

最初に、関数のインターフェイスが宣言されているクラスを書きました:

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

} 

メインプログラムは、関数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); 
//... 
} 

私はfucntionが呼び出されたプログラムを、デバッグする場合、私は例外を取得:

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 

ライブラリが見つけるように見えます例外は完全なライブラリパスを示しているためです。

問題がどこにあるのか誰でも説明できますか?

ご協力いただきありがとうございます。デバッガが、私はいないよ

Mono: DllImport error loading library 'libmylib32.so': '/usr/local/lib/libmylib32.so: undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE'. 

... 
000144c0 T libhndl 
... 
0013ee30 V _ZTV9SocketMgr 
     U _ZTVN10__cxxabiv117__class_type_infoE 
... 
+0

1)env var 'MONO_LOG_LEVEL = debug'を設定して、Monoがその共有ライブラリを見つけるために探索している場所と実際に何が失敗しているかを正確に**ダンプします。 2)dllmapをスキップし、LD_LIBRARY_PATHを使用してMonoにプローブする場所を指定します。つまり、 'export LD_LIBRARY_PATH =/usr/local/lib:$ LD_LIBRARY_PATHこれらは、あなたがそれを修正するための詳細情報や、 – SushiHangover

+0

私は理解できない未定義のシンボルを取得します。 Mono:ライブラリ 'libmylib32.so'をロードする際のDllImportエラー: '/usr/local/lib/libmylib32.so:未定義シンボル:_ZTVN10__cxxabiv117__class_type_infoE' – MaxTheBenax

+0

C++の名前を管理するように見えるこれらのC++ルーチンは、 'extern" C "'としてタグ付けする必要があります。他のコミットがソースを持っていないのを見ています...これらの呼び出しをラップするために、 'extern" C "'を返します。必要なABI呼び出しインタフェースの詳細については、http://www.mono-project.com/docs/advanced/pinvoke/を参照してください。 – SushiHangover

答えて

0

を返す/usr/local/lib/libmylib32.soコマンドNMを返すのenvのvar MONO_LOG_LEVEL =デバッグを設定するためのアドバイスに従い

どのようにモノがC++コードで動作するかを完全に確かめますが、あなたの問題はC++の名前のマングリングに関係していると思います。コードをextern Cブロックにラップしてみてください。

ではなく

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

を試してみてください。

+0

残念ながら私はライブラリのソースファイルを持っていません – MaxTheBenax

関連する問題