使用 mingw32 构建时与 cygwin1.dll 链接?

mic*_*c_e 4 c++ dll cygwin cross-platform mingw

我希望以尽可能少的工作量将 Linux C++ 应用程序移植到 Windows(即根本没有代码修改,也没有全新的构建系统)。

该应用程序主要对SDL和进行 API 调用OpenGL,这两者都在 Windows 上可用。但是,它也使用了POSIX诸如 ptys 之类的功能,这些功能阻止了我使用mingw32工具链。

Cygwin,或者更准确地说,cygwin1.dll实现整个POSIXAPI 并在内部将其转换为Win32. 我知道它Cygwin也带有自己的编译器套件,但据我所知,不可能直接调用Win32或其他 Windows 库(例如SDLOpenGL)。

因此,我的想法是使用mingw32(在大多数发行版上也可以方便地作为交叉编译器使用)构建项目,但此外还与cygwin1.dll. 然而,我开始怀疑互联网上似乎没有人尝试过这一点,而且 cygwin 编译器在 Linux 上似乎不可用。

所以我的问题是:

  • 这是一个合法的想法,还是即使我设法将其破解,一切都会失败吗?
  • 这样做的合法方法是什么(我从哪里获得 cygwin 头文件和 dll 文件)?

许可不是问题。

Ada*_*eld 5

这不可能行得通。关键问题是 C 运行时库 (CRT) 有两个不同且不兼容的版本——Cygwin 的 GNU 库 (glibc) 和 Microsoft 的 C 运行时。MinGW 工具链使用 Microsoft CRT,而 Cygwin GCC 工具链使用 Cygwin CRT。

这两个 CRT 中的每一个都以不同的方式实现。以malloc()函数为例。两种 CRT 的实现方式malloc()不同,可能是通过从操作系统分配虚拟内存VirtualAlloc(),然后以自己的方式相应地分配它。如果不知何故,您有一个程序将两个 CRT 都加载到其中,并且您malloc()从一个 CRT调用,但随后又尝试free()在另一个它,它会崩溃,因为每个 CRT 都不知道底层数据结构在另一个 CRT 中是如何工作的。

因此,即使您设法在这里拼凑了一些东西,并且让所有东西都可以编译和链接而没有错误,由于这种基本的不兼容性,它仍然会在运行时以“不可能”的方式崩溃。

现在,在这里做事的正确方法是什么?您需要决定要使用哪种 CRT。Microsoft CRT 不支持许多 POSIX 功能,因此如果您不想重写代码以避免所有这些丢失的 POSIX 功能,则必须使用 Cygwin CRT,并且必须将其用于所有项目中的代码(所有源文件、所有静态库、所有 DLL 等)。

您对 Win32 的理解是错误的——您可以从 Cygwin 程序调用原始 Win32 API。Cygwin GCC 工具链甚至带有自己的<windows.h>头文件。有反对调用函数一样,没有限制CreateFileVirtualAlloc等等。

对于您正在使用的其他库,例如 SDL 和 OpenGL,您需要这些库的版本,这些库是针对您所针对的相同 CRT 编译的。如果你有这些库的源代码,那么你可以自己编译它们。

以下是为 Cygwin 编译 SDL 的说明。对于OpenGL的,有一堆包,你可以通过Cygwin安装程序安装用于获取OpenGL头文件和库,例如在libEGL-devellibGL-devellibGLU-devellibglut-devel,和libGLw-devel包。