问题描述
在我的系统上运行一个简单的互操作示例时遇到问题.我构建了一个简单的 32 位共享库,名为 libtest.so (c++)
i have a problem running a simple interop example on my system. I built a simple 32-bit shared library called libtest.so (c++)
g++ -c -fpic test.cpp -m32
g++ -shared -fpic -o libtest.so test.o -m32
我的系统:Ubuntu Linux 10.04 x86_64
My System: Ubuntu Linux 10.04 x86_64
Mono C# 编译器版本 2.4.4.0
Mono C# compiler version 2.4.4.0
此外,我还有一个使用我的共享库的示例 c# 程序:
In addition i have a sample c# program using my shared library:
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;
}
}
问题:加载库不起作用.
The Problem: Loading the library does not work.
导出 MONO_LOG_LEVEL=debug 给我以下提示:Mono-INFO: DllImport error loading library './libtest.so: Wrong ELF-Class: ELFCLASS32'.
exporting MONO_LOG_LEVEL=debug gives me the following hint: Mono-INFO: DllImport error loading library './libtest.so: Wrong ELF-Class: ELFCLASS32'.
好吧,我猜 mono 在 64 位模式下运行我的程序,因此它不能调用 32 位共享库?如果我以 64 位模式(没有 -m32)构建共享库,一切正常!!
Well i guess mono runs my program in 64-bit mode and therefore it cannot call a 32-bit shared library? If i build the shared library in 64 bit mode (without -m32) everything works fine!!
我的 Mono-Compiler 2.4.4.没有使用/platform:x86 指定平台的选项,因此我安装了 2.10 版,但使用它也不起作用.
My Mono-Compiler 2.4.4. does not have the option to specify the platform with /platform:x86 and therefore i installed version 2.10, but using it does not work either.
/opt/mono-2.10/bin/gmcs /platform:x86 sharpCall.cs
是否有可能在 64 位系统上加载 32 位共享库?
Is there a possibility to load 32-bit shared libraries on a 64-bit system?
推荐答案
问题是您的系统上安装了 64 位版本的 Mono,它只能 P/Invoke 到 64 位本机库,它不能 P/Invoke 到 32 位本机库中.
The problem is that you have a 64bit version of Mono installed on your system which can only P/Invoke into 64bit native libraries, it cannot P/Invoke into 32bit native libraries.
-platform:x86 标志用于 C#编译器,而不是运行时,并且不提示运行时使用 32 位内存空间.
The -platform:x86 flag is meant for the C# compiler, not the runtime, and does not hint to the runtime to use a 32bit memory space.
如果你想 P/Invoke 到 32 位原生库,你需要在你的 Ubuntu 系统上安装 32 位版本的 Mono.
You need to install the 32bit version of Mono on your Ubuntu system if you want to P/Invoke into 32bit native libraries.
这篇关于单声道互操作:加载 32 位共享库在我的 64 位系统上不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!