首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使mono在Linux上接受PE32 DLL?

如何使mono在Linux上接受PE32 DLL?
EN

Stack Overflow用户
提问于 2022-06-22 02:15:59
回答 2查看 130关注 0票数 0

我试图使用win32单编译器在Linux主机上构建一个本地mcs应用程序。

我有一个库(CoolLib.dll),它有以下行

代码语言:javascript
运行
复制
[global::System.Runtime.InteropServices.DllImport("MyLib.dll", EntryPoint="...")]

它是使用mcs编译的,因此具有以下格式

代码语言:javascript
运行
复制
$ file CoolLib.dll
PE32+ executable (DLL) (console) x86-64 Mono/.Net assembly, for MS Windows

现在,MyLib.dll也是我的,我用mingw-g++在同一台主机上编译。

代码语言:javascript
运行
复制
$ file MyLib.dll
MyLib.dll: PE32+ executable (DLL) (console) x86-64, for MS Windows

然后我编译了我的hello可执行文件,引用了CoolLib.dll..。

代码语言:javascript
运行
复制
mcs /reference:CoolLib.dll /out:main.exe /target:x64 main.cs
MONO_LOG_LEVEL=debug mono main.exe

...but它和System.DllNotFoundException一起爆炸了。

然而,我不明白的是为什么它抱怨MyLib.dll 不是ELF

代码语言:javascript
运行
复制
Mono: DllImport error loading library '/bindings_test/MyLib.dll': '/bindings_test/MyLib.dll: invalid ELF header'.

毕竟,它应该是一个win32库。为什么mono希望它是一个ELF?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-06-24 19:46:43

从评论中抄来的。

你需要记住的一些事实是,

  • Linux/macOS原生可执行文件采用ELF格式(.so和
  • 原生可执行文件采用PE32格式(.dll和.exe))
  • .NET程序集(托管)采用PE32格式(.dll和.exe)

微软决定为托管位重用相同的文件扩展名和文件格式,所以像你这样的人在迁移到另一个操作系统之前不会很容易地注意到大的变化。

因此,要回答您的问题,如果您在Linux上有一些C/C++依赖项,那么必须使用本机C/C++编译器以ELF格式重新编译它们。然后,您的.NET核心/Mono应用程序可以使用PInvoke来使用它们。您不能以PE32格式使用这些本机依赖项,因为Linux不会识别这是什么。

票数 1
EN

Stack Overflow用户

发布于 2022-06-22 07:29:34

mcs生成的库是为目标Intel 80386生成的,而用mingw-g++构建的库是为目标x86-64生成的。

你不能混音平台。为32位或64位Windows构建所有内容。

例如,使用32位版本的MinGW-w64,或者使用-m32标志,如果您的MinGW-w64版本支持这两个目标。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72708990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档