c – 使用mingw32构建时与cygwin1.dll链接?
我希望尽可能少地将
Linux C应用程序移植到Windows(即根本不需要修改代码,也没有全新的构建系统).
该应用程序主要对SDL和OpenGL进行API调用,这些调用都可以在Windows上使用.但是,它也使用POSIX功能,如ptys,这阻止我使用mingw32工具链. Cygwin,或者更确切地说,cygwin1.dll,实现了整个POSIX API,并在内部将其转换为Win32.我知道Cygwin也有自己的编译器套件,但根据我的理解,不可能直接调用Win32或其他Windows库(如SDL或OpenGL). 因此,我的想法是使用mingw32构建项目(在大多数发行版中也可以方便地作为交叉编译器使用),但此外还与cygwin1.dll链接.然而,我怀疑互联网上似乎没有人试过这个,以及Linux上的cygwin编译器似乎不可用. 所以我的问题是: >这是一个合法的想法,或者即使我设法将它一起破解,一切都会失败吗? 许可不是问题. 解决方法
这不可行.关键问题是C运行时库(CRT)有两个不同且不兼容的版本 – Cygwin的GNU库(glibc)和Microsoft的C运行时. MinGW工具链使用Microsoft CRT,而Cygwin GCC工具链使用Cygwin CRT.
这两个CRT中的每一个都以不同的方式实现.以malloc()函数为例.两个CRT以不同方式实现malloc(),可能是通过VirtualAlloc()从OS分配虚拟内存,然后以自己的方式相应地对其进行分割.如果你有一个程序将两个CRT加载到它中并且你从一个CRT调用malloc()但是然后尝试在另一个CRT中释放()它会崩溃,因为每个CRT都不知道底层数据结构是如何工作的在另一个. 因此,即使你设法在这里拼凑了一些东西并且没有错误地编译和链接,它仍然会在运行时以“不可能”的方式崩溃,因为这种基本的不兼容性. 现在,在这里做事的正确方法是什么?您需要决定要使用哪个CRT. Microsoft CRT不支持许多POSIX功能,因此如果您不想重写代码以避免所有缺少POSIX功能,则必须使用Cygwin CRT,并且必须将它用于项目中的所有代码(所有源文件,所有静态库,所有DLL等). 您对Win32的理解是错误的 – 您可以从Cygwin程序调用原始Win32 API. Cygwin GCC工具链甚至还带有自己的< windows.h>头文件.对调用CreateFile,VirtualAlloc等函数没有任何限制. 对于您正在使用的其他库,例如SDL和OpenGL,您需要针对您所针对的相同CRT编译的那些库的版本.如果你有库的源代码,那么你可以自己编译它们. Here are instructions用于为Cygwin编译SDL.对于OpenGL,您可以通过Cygwin设置安装一堆软件包来获取OpenGL头文件和库,例如: libEGL-devel,libGL-devel,libGLU-devel,libglut-devel和libGLw-devel包. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |