我们的供应商提供适用于Windows的DLL。是否可以加载自定义 xxx.dll 文件并使用Go在 Linux 中使用其功能?
答案 0 :(得分:3)
简短的回答是“不”:当您“加载”动态链接库时,它不仅实际加载(如从文件中读取),而是链接到您的地址空间运行程序 - 通过操作系统提供的特殊方法(在基于Linux的系统上,至少在x86 / amd64平台上是一个外部进程;在Windows上,它是一个内核工具,AFAIK)。 换句话说,加载动态链接库会让你背后发生很多复杂的事情。
另一个复杂因素是DLL是否是“自包含”的,它只包含“纯”函数 - 它只对输入数据执行计算以提供输出数据,或者它们调用操作系统在文件上执行I / O等活动。 操作系统为运行进程提供这些活动的方式在Windows和Linux之间完全不同。
我能想到的最后一个复杂因素是这个库对其他人的依赖。
如果库的代码是用C或C ++编写的,很可能取决于编译库的编译器所使用的C库(在Windows上,它通常是MSVCRxx.DLL
的东西)。 (一个简单的例子是在库的代码中调用malloc()
或printf()
或类似的内容。)
所有这些意味着在Windows for Windows上编写的大多数DLL都依赖于Windows和与用于构建该库的编译器相关联的C或C ++标准库。
更不用说Windows DLL为其模块使用PE(可移植可执行文件)格式,而基于GNU / Linux的系统本身使用ELF格式作为其共享对象文件。
答案 1 :(得分:0)
我担心不是因为Windows DLL与Linux共享对象进行不同的内核调用,两者都有系统库对象的这个奇特名称
但是如果你需要在Linux上运行一个Windows原生应用程序,我会建议尝试一下Wine,我怀疑它是否正常工作,第二个值得尝试的是dosbox,一旦我怀疑它也有效
但是如果这些DLL是用.net框架编写的,那么你可以将它们包装在一个很好的c#代码上并在linux端使用mono,但不确定这是否能让你将这些DLL导入golang,但是我不这么认为
在使用一定数量的技巧让你的一切正常运行时,你会遇到一些性能问题,只需说出
即可