我有一个为Linux Ubuntu 32bit编译的c ++库libmylib32.so。
该库位于usr / local / lib中,我确认它正在使用C ++程序。
在文件/ etc / mono / config中我添加了
<dllmap dll="mylib32.dll" target="/usr/local/lib/libmylib32.so"/>
我也试过
<dllmap dll="mylib32.dll" target="/usr/local/lib/libmylib32.so" os="!windows"/>
我用monodevelop编写了一个C#程序来调用C ++函数:
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
库似乎找到了库,因为异常显示了完整的库路径。
有人可以解释问题的原因吗?
提前感谢您的帮助。
按照建议设置env var MONO_LOG_LEVEL = debug,调试器返回
Mono: DllImport error loading library 'libmylib32.so': '/usr/local/lib/libmylib32.so: undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE'.
命令nm /usr/local/lib/libmylib32.so返回
...
000144c0 T libhndl
...
0013ee30 V _ZTV9SocketMgr
U _ZTVN10__cxxabiv117__class_type_infoE
...
答案 0 :(得分:0)
我不完全确定单声道如何使用C ++代码,但我想你的问题与C ++名称修改有关。尝试将代码包装在extern C
块中。
尝试
extern "C" {
short libhndl( const char *, unsigned short, long, unsigned short * );
}
代替。