场景
- 在开发
Win32
程序时,很多情况下我们都需要使用开源的第三方C/C++
库,而第三方C/C++
库一般都是基于gcc
编译的,而这些库大多除了使用标准库之外还使用了系统(linux
)的API
,从而我们使用VS
是基本编译不过的,怎么办?
说明
-
目前使用这种第三方库有三种办法:
1.1 第一种是如果它没有
vs
构建文件的话,把源码导入vs
,并且修改无法编译的函数为Windows
的函数,或者实现这个找不到的函数功能。这个办法是最麻烦的,需要足够的耐心和试错。1.2 第二种是使用cygwin这个
gnu
的开源工具,它的核心是提供cygwin
库来提供POSIX
(可移植操作系统接口)系统调用和环境. 它提供的环境能让绝大多数支持libc,pthread
库的开源库编译和运行。比如把linux
上的开发的gtk
开发的软件移植到Windows
,使用cygwin
能快速移植。但是由于它是模拟POSIX
环境,所以它的性能并不如Win32
环境开发的软件。但是这个cygwin
的致命缺点是它不能同时链接MSVCRT*.DLL
和cygwin1.dll
.两个运行时会导致C/C++
库调用崩溃。所以使用cygwin
时最好就是不要和vs
编译的库混用。1.3 第三种是使用mingw,它支持
gcc
编译到Win32
的本地运行时环境。优点就是编译出来的库可以静态链接到MSVCRT*.DLL
. 是大多数跨平台的库优先选择.
cygwin特点
-
cygwin
维护着容易升级更新的安装包,并维护着可在线升级的第三方库列表,可以通过官方提供的软件容易进行在线升级。 -
如果想编译不依赖
cygwin1.dll
的Win32
程序,那么使用cygwin
里自带的mingw64-i686-gcc
和mingw64-x86_64-gcc
包提供的编译器链接到标准Microsoft dll
而不是Cygwin
。但是要注意,要避免该程序依赖的第三方库仍然依赖cygwin1.dll
. -
如果要使用
cygwin
作为主开发环境,那么避免静态链接到依赖MSVCRT*.DLL
的库.如果要使用, 可以通过loadlibrary
来加载C
接口,而C++
接口由于Windows
的C++
目标对象格式和GNU
不同,不能加载。 -
cygwin
编译的库通过lib
工具生成*.lib
库在vs
静态链接不能使用,参考3. -
cygwin
不能使用Win32
环境的崩溃文件*.dmp
,由于pdb
格式目前未开放,所以本地程序如果崩溃了基本上无法定位, 这是大多数开发不使用cygwin
的主要原因。
mingw特点
-
编译出来的库
.a
可以直接在vs
上链接使用,而lib
文件在mingw
上也可以通过转换静态链接,也就是可以互相调用。 -
mingw
生成的程序可以生成*.dmp
文件,也就是可以处理系统的结构化异常。 -
缺点是安装包没有统一维护或者是下载失败,下载安装需要自己去手动下载。没有维护支持的第三方库的更新列表,也是需要自己手动下载。
-
关于
mingw
编译的*.dll
生成*.lib
文件,可以看参考[3]
参考
[1] cygwin faq
[2] mingw
[3] 从Dll生成lib