У меня есть библиотека C++ libmylib32.so, скомпилированная для Linux Ubuntu 32bit.monodevelop System.DllNotFoundException вызов функции в библиотеке C++
Библиотека находится в usr/local/lib, и я подтвердил, что она работает в программе на C++.
В файле/и т.д./моно/конфигурации я добавил
<dllmap dll="mylib32.dll" target="/usr/local/lib/libmylib32.so"/>
, и я также попытался с
<dllmap dll="mylib32.dll" target="/usr/local/lib/libmylib32.so" os="!windows"/>
Я написал C# программы с MonoDevelop для вызова функции в Си ++:
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_LOG_LEVEL = отлаживать отладчик возвращает
Mono: DllImport error loading library 'libmylib32.so': '/usr/local/lib/libmylib32.so: undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE'.
Команда нм /usr/local/lib/libmylib32.so возвращает
...
000144c0 T libhndl
...
0013ee30 V _ZTV9SocketMgr
U _ZTVN10__cxxabiv117__class_type_infoE
...
1) Установите env var 'MONO_LOG_LEVEL = debug', чтобы получить ** очень подробный ** дамп точно, где Mono пытается найти эту общую библиотеку и что действительно не удается. 2) Пропустите dllmap и используйте LD_LIBRARY_PATH, чтобы сообщить Mono, где его искать, т. Е. «Экспортировать LD_LIBRARY_PATH =/usr/local/lib: $ LD_LIBRARY_PATH. Они должны получить дополнительную информацию, чтобы исправить помощь, которую вы исправите, или больше информации для нас, чтобы помочь. – SushiHangover
Я получаю неопределенный символ, который я не могу понять. Mono: библиотека загрузки ошибок DllImport 'libmylib32.so': '/usr/local/lib/libmylib32.so: undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE'. – MaxTheBenax
Появляется как управление именами C++, эти подпрограммы C++ должны быть помечены как «extern» C «', я вижу, что ваш другой фиксатор не имеет источника ... Вы могли бы создать другую библиотеку на C++ для переноса этих вызовов с помощью «extern» C ". См. Http://www.mono-project.com/docs/advanced/pinvoke/ для получения дополнительной информации о требуемом интерфейсе ABI – SushiHangover