Answer

问题及解答

使用 Visual Studio 2015编译的 curl

Posted by haifeng on 2019-02-17 14:07:05 last update 2019-02-17 22:56:39 | Edit | Answers (0)

Windows 10 下使用 VS2015 编译的 curl
=========================

目的:编译的 curl

操作系统:Windows 10

编译工具:Visual Studio 2015
====================


准备工作:
1. 已经安装 Visual Studio 2015


开始
===

Step 1. 下载 curl 源代码
curl-7.64.0.tar.gz
网址: https://curl.haxx.se/download.html

解压缩至某个文件夹, 比如 D:\download\C++\curl\curl-7.64.0

Step 2.

其他的如 libssh2, nghttp2, openssl, zlib 从下面的网址下载
https://windows.php.net/downloads/php-sdk/deps/
这里分别下载
libssh2-1.8.0-vc14-x86.zip
nghttp2-1.32.0-vc14-x86.zip
openssl-1.0.2q-vc14-x86.zip
zlib-1.2.8-vc14-x86.zip

分别解压缩后,得到 bin\  include\ lib\ 三个文件夹,将它们拷贝到
D:\download\C++\curl\curl-7.64.0\deps\ 文件夹中

目录结构形如:

   somedirectory\
    |_curl-src
    | |_winbuild
    |
    |_deps
      |_ bin
      |_ include
      |_ lib

这里 somedirectory=D:\download\C++\curl\curl-7.64.0
       curl-src=curl-7.64.0

Step 3. 切换至 winbuild 文件夹
cd D:\download\C++\curl\curl-7.64.0\curl-7.64.0\winbuild

Step 4. 详细阅读 BUILD.WINDOWS.txt
特别是下面这部分内容
Building with Visual C++
========================


Step 5. 编译
打开 VS 开发人员命令提示,执行下面的命令

nmake /f Makefile.vc mode=static VC=14 WITH_SSL=static WITH_NGHTTP2=dll WITH_ZLIB=static WITH_SSH2=static

nmake /f Makefile.vc mode=dll VC=14 WITH_SSL=static WITH_NGHTTP2=dll WITH_ZLIB=static WITH_SSH2=static

这里 VC=14 对应 VS2015,注意生成的是 x86 机器上的,即上面缺省 MACHINE=x86

然后在 builds 文件夹下有
libcurl-vc14-x86-release-static-ssl-static-zlib-static-ssh2-static-ipv6-sspi-nghttp2-dll


//---------------------------------
如果要加上 CARES,则首先下载c-ares-1.15.0.tar (https://c-ares.haxx.se/)

* 解压缩
* 阅读 INSTALL.md,  P327, ### MSVC from command line
*        参见 [README.msvc]
*  编译步骤很简单
*  首先打开 VS 开发人员命令提示,然后输入下面的命令
*  nmake -f Makefile.msvc
*  编译结束会生成 msvc 文件夹,其中有四个子文件夹
*  msvc
*     |_ acountry
*     |_ adig
*     |_ ahost
*     |_ cares
* 其中 cares 文件夹包含了我们需要的文件(c-ares 库文件),而其余三个是例子程序,用到了这个库。

下面,为了编译 curl 和 libcurl, 在上面的 deps 文件夹下创建子文件夹 c-ares
将 cares 中的文件复制到
D:\download\C++\curl\curl-7.64.0\deps\c-ares

具体 c-ares 中的文件清单参见文末的附录
//---------------------------------

最后回到
D:\download\C++\curl\curl-7.64.0\curl-7.64.0\winbuild

在 VS 开发人员命令提示下键入如下命令

nmake /f Makefile.vc mode=static VC=14 WITH_SSL=static WITH_NGHTTP2=dll WITH_ZLIB=static WITH_SSH2=static WITH_CARES=static CARES_PATH=../../deps/c-ares

nmake /f Makefile.vc mode=static VC=14 WITH_SSL=dll WITH_NGHTTP2=dll WITH_ZLIB=static WITH_SSH2=static WITH_CARES=dll CARES_PATH=../../deps/c-ares

分别编译得到相应的 curl.exe 及其他文件.

========================================
See also
http://www.atzjg.net/admin/do/view_question.php?qid=2203


=========================
附录 A. c-ares 中的文件清单
=========================

其中 include 中的文件就是来自于 c-ares-1.15.0 中的 .c 和 .h 文件

D:\DOWNLOAD\C++\CURL\CURL-7.64.0\DEPS\C-ARES
+---bin
|       cares.dll
|       cares.exp
|       caresd.dll
|       caresd.exp
|       caresd.pdb
|
+---include
|       acountry.c
|       adig.c
|       ahost.c
|       ares.h
|       ares_android.c
|       ares_android.h
|       ares_build.h
|       ares_cancel.c
|       ares_create_query.c
|       ares_data.c
|       ares_data.h
|       ares_destroy.c
|       ares_dns.h
|       ares_expand_name.c
|       ares_expand_string.c
|       ares_fds.c
|       ares_free_hostent.c
|       ares_free_string.c
|       ares_getenv.c
|       ares_getenv.h
|       ares_gethostbyaddr.c
|       ares_gethostbyname.c
|       ares_getnameinfo.c
|       ares_getopt.c
|       ares_getopt.h
|       ares_getsock.c
|       ares_inet_net_pton.h
|       ares_init.c
|       ares_iphlpapi.h
|       ares_ipv6.h
|       ares_library_init.c
|       ares_library_init.h
|       ares_llist.c
|       ares_llist.h
|       ares_mkquery.c
|       ares_nowarn.c
|       ares_nowarn.h
|       ares_options.c
|       ares_parse_aaaa_reply.c
|       ares_parse_a_reply.c
|       ares_parse_mx_reply.c
|       ares_parse_naptr_reply.c
|       ares_parse_ns_reply.c
|       ares_parse_ptr_reply.c
|       ares_parse_soa_reply.c
|       ares_parse_srv_reply.c
|       ares_parse_txt_reply.c
|       ares_platform.c
|       ares_platform.h
|       ares_private.h
|       ares_process.c
|       ares_query.c
|       ares_rules.h
|       ares_search.c
|       ares_send.c
|       ares_setup.h
|       ares_strcasecmp.c
|       ares_strcasecmp.h
|       ares_strdup.c
|       ares_strdup.h
|       ares_strerror.c
|       ares_strsplit.c
|       ares_strsplit.h
|       ares_timeout.c
|       ares_version.c
|       ares_version.h
|       ares_writev.c
|       ares_writev.h
|       ares__close_sockets.c
|       ares__get_hostent.c
|       ares__read_line.c
|       ares__timeval.c
|       bitncmp.c
|       bitncmp.h
|       config-dos.h
|       config-win32.h
|       inet_net_pton.c
|       inet_ntop.c
|       nameser.h
|       setup_once.h
|       windows_port.c
|
\---lib
        cares.lib
        caresd.lib
        libcares.lib
        libcaresd.lib