2016-04-07 2 views
0

У меня есть библиотека 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 
... 
+0

1) Установите env var 'MONO_LOG_LEVEL = debug', чтобы получить ** очень подробный ** дамп точно, где Mono пытается найти эту общую библиотеку и что действительно не удается. 2) Пропустите dllmap и используйте LD_LIBRARY_PATH, чтобы сообщить Mono, где его искать, т. Е. «Экспортировать LD_LIBRARY_PATH =/usr/local/lib: $ LD_LIBRARY_PATH. Они должны получить дополнительную информацию, чтобы исправить помощь, которую вы исправите, или больше информации для нас, чтобы помочь. – SushiHangover

+0

Я получаю неопределенный символ, который я не могу понять. Mono: библиотека загрузки ошибок DllImport 'libmylib32.so': '/usr/local/lib/libmylib32.so: undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE'. – MaxTheBenax

+0

Появляется как управление именами C++, эти подпрограммы C++ должны быть помечены как «extern» C «', я вижу, что ваш другой фиксатор не имеет источника ... Вы могли бы создать другую библиотеку на C++ для переноса этих вызовов с помощью «extern» C ". См. Http://www.mono-project.com/docs/advanced/pinvoke/ для получения дополнительной информации о требуемом интерфейсе ABI – SushiHangover

ответ

0

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

Попробуйте

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

вместо этого.

+0

К сожалению, у меня нет исходных файлов библиотеки – MaxTheBenax

 Смежные вопросы

  • Нет связанных вопросов^_^