c # — monodevelop System.DllNotFoundException, вызывающий функцию в библиотеке C ++

У меня есть библиотека C ++ libmylib32.so, скомпилированная для Linux Ubuntu 32bit.

Библиотека находится в 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"/>

Я написал программу на C # с monodevelop для вызова функции 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);
//...
}

Если я отлаживаю программу, когда вызывается функция, я получаю исключение:

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

Решение

Я не совсем уверен, как моно работает с кодом C ++, но я думаю, что ваша проблема связана с искажением имен C ++ Попробуйте обернуть ваш код в extern C блок.

Пытаться

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

вместо.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]