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 库(例如SDL或OpenGL)。
因此,我的想法是使用mingw32(在大多数发行版上也可以方便地作为交叉编译器使用)构建项目,但此外还与cygwin1.dll. 然而,我开始怀疑互联网上似乎没有人尝试过这一点,而且 cygwin 编译器在 Linux 上似乎不可用。
所以我的问题是:
许可不是问题。
这不可能行得通。关键问题是 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>头文件。有反对调用函数一样,没有限制CreateFile,VirtualAlloc等等。
对于您正在使用的其他库,例如 SDL 和 OpenGL,您需要这些库的版本,这些库是针对您所针对的相同 CRT 编译的。如果你有这些库的源代码,那么你可以自己编译它们。
以下是为 Cygwin 编译 SDL 的说明。对于OpenGL的,有一堆包,你可以通过Cygwin安装程序安装用于获取OpenGL头文件和库,例如在libEGL-devel,libGL-devel,libGLU-devel,libglut-devel,和libGLw-devel包。
| 归档时间: |
|
| 查看次数: |
585 次 |
| 最近记录: |