Keen的博客

记录所思、所想、所遇

欢迎来到我的个人站~


【架构设计】curl原理剖析

1. 源码编译

1.1. Win下源码编译

1.1.1. 准备工作

环境准备

注意

  • 源码目录结构需要保证正确,如下: ```txt
  • curl |- docs |- …
  • openssl |- apps |- …
  • libssh2 |- docs |- … ```

1.1.2. OpenSSL编译

比较好的是,curl将openssl的编译也支持到了,参考:curl\projects\build-openssl.bat(可以先看curl\projects\README),使用build-openssl.bat -help查看使用帮助。

普通编译命令行示例

rem 注意,我们这里的代码路径是C:\Program Files (x86)\Microsoft Visual Studio 14.0,由于我们内部使用了多版本vs(2019和2015),但实际上主程序是一个2019版本,前面的参数vc14不能写成vc14.2(这个会查找C:\Program Files (x86)\Microsoft Visual Studio 2019这个路径)
rem 整个编译,会生成动态库、静态库、debug版本、release版本

build-openssl vc14 x86 debug "E:\Code\openssl" -VSpath "C:\Program Files (x86)\Microsoft Visual Studio 14.0" -perpath "C:\Strawberry\perl"
build-openssl vc14 x86 release "E:\Code\openssl" -VSpath "C:\Program Files (x86)\Microsoft Visual Studio 14.0" -perpath "C:\Strawberry\perl"

注意:

  • 多编译器环境下,编译会出现rc.exe找不到的问题(实际是冲突了,不知道使用哪个),因此,运行命令行需要使用vs2019的专用命令行运行上述脚本;而无多编译器场景下,一般上述脚本会自动查找对应的运行环境
  • 若上述选择vs2005版本等,编译中还会出现CreateFiber等链接错误(vs2019不会出现问题),是由于NT版本问题,需要修改build-openssl.bat,增加-D_WIN32_WINNT=0x0501
    perl "%SOURCE_PATH%\Configure" %options% -D_WIN32_WINNT=0x0501 "--prefix=%TMP_INSTALL_PATH%"
    

上述编译完成后,会生成:

  • openssl\build\Win32\VC14\LIB Debug
  • openssl\build\Win32\VC14\DLL Debug
  • openssl\build\Win32\VC14\LIB Release
  • openssl\build\Win32\VC14\DLL Release

1.1.3. libssh2编译

由于libssh2在curl中没有方便的编译脚本,需要自行编译。通过尝试,发现libssh2-1.10.0支持openssl1.1.1i(cmake中会提示找openssl这个版本,同时前面用最新的1.1.1l会出错),这里需要先通过上述流程编译一遍OpenSSL1.1.1i,然后将依赖库,组成如下结构(参考:https://www.libssh2.org/mail/libssh2-devel-archive-2019-02/0007.shtml):

- openssl
  |- include
     |- openssl
  libssl.lib
  libcrypto.lib

libssh2当前版本(1.10.0)使用cmake工具进行编译,配合openssl需要设置几个参数:

CMAKE_INSTALL_PREFIX=xxxx\libssh2\build\libssh2
CRYPTO_BACKEND=OpenSSL
OPENSSL_ROOT_DIR=xxxx\libssh2\build\openssl(注意,这里就上述组成的一个文件结构,按照上述结构会自动寻找include、lib)

编译完毕后,这里生成了libssh2,为了能让curl顺利编译,还需要重建目录结构(实际build-openssl.bat也是这样处理的)

- libssh2
  |- build
     |- Win32
        |- VC14
           |- Lib Release
              |- libssh2.lib

1.1.4. libcurl静态库/动态库编译

前面的过程完毕后,这里libcurl编译就非常容易了

  • 找到curl\projects\generate.bat,生成工程文件
  • 找到curl\projects\Windows\VC14\curl-all.sln,用vs2019打开,选择对应的版本编译即可

2. 源码分析

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少