加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:49:21 所属栏目:百科 来源:网络整理
导读:我希望尽可能少地将 Linux C应用程序移植到Windows(即根本不需要修改代码,也没有全新的构建系统). 该应用程序主要对SDL和OpenGL进行API调用,这些调用都可以在Windows上使用.但是,它也使用POSIX功能,如ptys,这阻止我使用mingw32工具链. Cygwin,或者更确切地说
我希望尽可能少地将 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编译器似乎不可用.

所以我的问题是:

>这是一个合法的想法,或者即使我设法将它一起破解,一切都会失败吗?
>这样做的合法方式是什么(我在哪里获得cygwin头文件和dll文件)?

许可不是问题.

解决方法

这不可行.关键问题是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包.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读