我可以从 linux 客户端调用 windows DLL 吗? [复制]
Posted
技术标签:
【中文标题】我可以从 linux 客户端调用 windows DLL 吗? [复制]【英文标题】:Can I call a windows DLL from a linux client? [duplicate] 【发布时间】:2011-08-08 14:55:50 【问题描述】:我在教程中找到了这个命令行:
gcc -o Client1 Client1.o CodeSample1.dll -lgdi32 -lm
让我想知道什么时候可以从 linux 客户端调用 windows DLL,或者从 windows 客户端调用 Linux .so 文件。是否有语言、名称装饰等限制?
【问题讨论】:
【参考方案1】:我怀疑你实际上并没有试图问你问了什么。
您示例中的 .dll 文件只是一个共享库。您可以使用 GCC 链接到共享库。唯一的问题是你如何称呼你的图书馆:
// Stage 1: Build and link the library:
gcc -c -o mylib.o mylib.c // Compile
gcc -shared -o mylib.dll mylib.o // on Windows
gcc -shared -o libmylib.so mylib.o // on Linux etc.
命名约定实际上只是一个约定。现在链接您的程序:
// Stage 2: Build and link your application:
gcc -c o main.c main.cpp // Compile
gcc -o main main.o mylib.dll -lm -lfoo -lgdi32 // Windows
gcc -o main main.o libmylib.so -lm -lfoo // Linux
gcc -o main main.o -lmylib -lm -lfoo -L/opt/mylibs // Alternatively
因此,如果代码完全在您手中,您只需先构建库,然后链接到您的项目。
如果你的意思是库源代码不可用并且你只有一个 Windows 二进制文件,那么情况就复杂多了。例如,二进制格式甚至不兼容。
【讨论】:
你一针见血,但我还有一个问题要问你。 DLL 是使用 VB6 编译器创建的。这不是创建 Windows 二进制文件吗?为什么这仍然可以使用 gcc 链接? 在 Windows 下,作为 GCC 一部分的链接器使用 Windows 二进制格式,因此它可以读取任何 Windows DLL(都使用相同的二进制格式)。只要你只是使用 C 函数,你就相对安全,因为 C ABI 非常稳定。如果您尝试使用 C++ 类库进行相同操作,您可能会遇到麻烦。 Linux 下会发生什么?我可以使用 gcc 链接 DLL 吗? 如果 DLL 已经在 Windows 下构建和链接,那么通常“否”,因为您的 Linux 使用不同的二进制格式(通常是 Linux 中的 ELF 和 Windows 中的 PXE)。但是,即使您可以读取二进制格式(原则上这是可能的),只要 DLL 进行任何类型的系统调用或对 OS 函数的引用,您就会被卡住。不过你可以试试wine
和wine-gcc
,也许Wine 实现了你的DLL 需要的操作系统特性。
@KerrekSB 假设我们可以在 linux 中读取 dll 二进制格式,您所指的系统调用和操作系统函数是 Windows“内核”的一部分吗?或者换句话说,为什么我们不能从它们对应的dll文件中类似地读取系统和操作系统调用?以上是关于我可以从 linux 客户端调用 windows DLL 吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
是否可以从在 Wine 中运行的 Windows 应用程序调用本机 Linux API?
从托管在 Linux 服务器上的 Java 客户端使用 WCF
phpMyAdmin 无法从 Linux 客户端连接到 Windows 7 上的远程服务器