[C/C++]_[Windows]_[Cygwin和MinGW的特点]

开发程序使用开源第三方库时编译常遇问题,本文介绍三种解决办法:导入源码修改、用Cygwin工具、用MinGW。还阐述了Cygwin和MinGW的特点,如Cygwin可移植但性能一般、不能同时链接两种运行时,MinGW编译的库可本地运行、能处理异常但安装维护较麻烦。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景

  1. 在开发Win32程序时,很多情况下我们都需要使用开源的第三方C/C++库,而第三方C/C++库一般都是基于gcc编译的,而这些库大多除了使用标准库之外还使用了系统(linux)的API,从而我们使用VS是基本编译不过的,怎么办?

说明

  1. 目前使用这种第三方库有三种办法:

    1.1 第一种是如果它没有vs构建文件的话,把源码导入vs,并且修改无法编译的函数为Windows的函数,或者实现这个找不到的函数功能。这个办法是最麻烦的,需要足够的耐心和试错。

    1.2 第二种是使用cygwin这个gnu的开源工具,它的核心是提供cygwin库来提供POSIX(可移植操作系统接口)系统调用和环境. 它提供的环境能让绝大多数支持libc,pthread库的开源库编译和运行。比如把linux上的开发的gtk开发的软件移植到Windows,使用cygwin能快速移植。但是由于它是模拟POSIX环境,所以它的性能并不如Win32环境开发的软件。但是这个cygwin的致命缺点是它不能同时链接MSVCRT*.DLLcygwin1.dll.两个运行时会导致C/C++库调用崩溃。所以使用cygwin时最好就是不要和vs编译的库混用。

    1.3 第三种是使用mingw,它支持gcc编译到Win32的本地运行时环境。优点就是编译出来的库可以静态链接到MSVCRT*.DLL. 是大多数跨平台的库优先选择.

cygwin特点

  1. cygwin维护着容易升级更新的安装包,并维护着可在线升级的第三方库列表,可以通过官方提供的软件容易进行在线升级。

  2. 如果想编译不依赖cygwin1.dllWin32程序,那么使用cygwin里自带的mingw64-i686-gccmingw64-x86_64-gcc包提供的编译器链接到标准Microsoft dll而不是Cygwin。但是要注意,要避免该程序依赖的第三方库仍然依赖cygwin1.dll.

  3. 如果要使用cygwin作为主开发环境,那么避免静态链接到依赖MSVCRT*.DLL的库.如果要使用, 可以通过loadlibrary来加载C接口,而C++接口由于WindowsC++目标对象格式和GNU不同,不能加载。

  4. cygwin编译的库通过lib工具生成*.lib库在vs静态链接不能使用,参考3.

  5. cygwin不能使用Win32环境的崩溃文件*.dmp,由于pdb格式目前未开放,所以本地程序如果崩溃了基本上无法定位, 这是大多数开发不使用cygwin的主要原因。

mingw特点

  1. 编译出来的库.a可以直接在vs上链接使用,而lib文件在mingw上也可以通过转换静态链接,也就是可以互相调用。

  2. mingw生成的程序可以生成*.dmp文件,也就是可以处理系统的结构化异常。

  3. 缺点是安装包没有统一维护或者是下载失败,下载安装需要自己去手动下载。没有维护支持的第三方库的更新列表,也是需要自己手动下载。

  4. 关于mingw编译的*.dll生成*.lib文件,可以看参考[3]

参考

[1] cygwin faq

[2] mingw

[3] 从Dll生成lib

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白行微

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值