У меня проблема с запуском простого примера взаимодействия в моей системе.
Я создал простую 32-битную разделяемую библиотеку с именем libtest.so (c ++)
g++ -c -fpic test.cpp -m32
g++ -shared -fpic -o libtest.so test.o -m32
Моя система:
Ubuntu Linux 10.04 x86_64
Mono C # версия компилятора 2.4.4.0
Кроме того, у меня есть пример программы на c # с использованием моей общей библиотеки:
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
public class Test
{
[DllImport("libdl.so")]
static extern IntPtr dlopen(string filename, int flags);
[DllImport("libdl.so")]
static extern IntPtr dlclose(IntPtr handle);
[DllImport ("./libtest.so")]
private static extern void HelloWorld();
[DllImport ("./libtest.so",EntryPoint="Test")]
private static extern int Testl(int a,int b);
public static int Main(string[] args)
{
IntPtr handle = dlopen("./libtest.so",2);
if(handle == IntPtr.Zero)
{
Console.WriteLine("Error loading shared library");
return -1;
}
HelloWorld();
int ret = Testl(116,1);
Console.WriteLine("Result from shared-Librarry Call: " + ret);
dlclose(handle);
return 0;
}
}
Проблема: загрузка библиотеки не работает.
экспорт MONO_LOG_LEVEL = debug дает мне следующую подсказку:
Mono-INFO: ошибка загрузки библиотеки DllImport './libtest.so: неправильный класс ELF: ELFCLASS32'.
Ну, я думаю, что mono запускает мою программу в 64-битном режиме, и поэтому она не может вызвать 32-битную разделяемую библиотеку? Если я собираю общую библиотеку в 64-битном режиме (без -m32), все работает отлично !!
Мой моно-компилятор 2.4.4. не имеет возможности указать платформу с / platform: x86 и, следовательно, я установил версию 2.10, но использование ее также не работает.
/opt/mono-2.10/bin/gmcs /platform:x86 sharpCall.cs
Есть ли возможность загрузить 32-битные разделяемые библиотеки в 64-битной системе?