libcurl 开启https一键编译指南【MT方式】

编译环境: win10 vs2022 cmake4.2.1

编译方式静态:MT lib

cmake4.2.1 静态编译参数是:

bash 复制代码
 -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded^

更多参考:

CMAKE_MSVC_RUNTIME_LIBRARY --- CMake 4.2.1 Documentation

1、curl-8.17.0

2、openssl-1.1.1h

NASM perl5.32.1.exe

3、zlib-1.3.1

4、脚本build_all.bat

bash 复制代码
@echo off
cls
chcp 65001 >nul

echo ======================================================
echo           OpenSSL+zlib+cURL 静态MT版本编译脚本
echo           x64 静态库  MT运行时  无依赖
echo ======================================================
echo.

:: ===================== 配置区(根据实际情况修改)=====================
set "OPENSSL_SRC=E:\test\openssl-1.1.1h"
set "OPENSSL_INSTALL=E:\test\openssl-1.1.1h-install"
set "ZLIB_SRC=E:\test\zlib-1.3.1"
set "ZLIB_INSTALL=E:\test\zlib-1.3.1-static"
set "CURL_SRC=E:\test\curl-8.17.0"
set "CURL_INSTALL=E:\test\curl-8.17.0-static"
set "CMAKE_PATH=C:\Program Files\CMake3.18.4\bin\cmake.exe"
set "VS_GENERATOR=Visual Studio 17 2022"
set "PLATFORM=x64"
:: ====================================================================

:: 检查工具与源码路径有效性
if not exist "%CMAKE_PATH%" (
    echo 错误:未找到 CMake,请检查路径是否正确
    pause
    exit /b 1
)
if not exist "%OPENSSL_SRC%\Configure" (
    echo 错误:未找到 OpenSSL 源码,请检查路径是否正确
    pause
    exit /b 1
)
if not exist "%ZLIB_SRC%\CMakeLists.txt" (
    echo 错误:未找到 zlib 源码,请检查路径是否正确
    pause
    exit /b 1
)
if not exist "%CURL_SRC%\CMakeLists.txt" (
    echo 错误:未找到 cURL 源码,请检查路径是否正确
    pause
    exit /b 1
)

:: 1. 编译 OpenSSL 静态MT版本
echo 开始编译 OpenSSL...
cd /d "%OPENSSL_SRC%"
:: 检查 Perl(OpenSSL Configure 依赖)
perl -v >nul 2>&1
if %errorlevel% neq 0 (
    echo 错误:未找到 Perl,请安装 StrawberryPerl 或 ActivePerl,并确保 perl 在 PATH 中
    pause
    exit /b 1
)
nmake clean > nul 2>&1
rd /s /q out32 >nul 2>&1
:: 强制使用静态 CRT (/MT)
set "CL=/MT /O2 /W3"
perl Configure VC-WIN64A no-shared --prefix="%OPENSSL_INSTALL%" --release
if %errorlevel% neq 0 (
    echo OpenSSL 配置失败
    pause
    exit /b 1
)
nmake
if %errorlevel% neq 0 (
    echo OpenSSL 编译失败
    pause
    exit /b 1
)
nmake install
:: 清理临时环境变量
set "CL="
echo OpenSSL 编译安装完成
echo.

:: 2. 编译 zlib 静态MT版本
echo 开始编译 zlib...
cd /d "%ZLIB_SRC%"
rmdir /s /q build > nul 2>&1
mkdir build && cd build
"%CMAKE_PATH%" .. -G "%VS_GENERATOR%" -A %PLATFORM%^
 -DCMAKE_INSTALL_PREFIX="%ZLIB_INSTALL%"^
 -DBUILD_SHARED_LIBS=OFF^
 -DZLIB_BUILD_SHARED=OFF^
 -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded^
 -DCMAKE_C_FLAGS_RELEASE="/MT /O2"^
 -DCMAKE_BUILD_TYPE=Release
if %errorlevel% neq 0 (
    echo zlib 配置失败
    pause
    exit /b 1
)
"%CMAKE_PATH%" --build . --config Release --target install -j8
echo zlib 编译安装完成
echo.

:: 3. 编译 cURL 静态MT版本 - 仅禁用3个报错依赖,其余功能全部保留
:: 检查关键依赖有效性
if not exist "%CMAKE_PATH%" (
    echo 错误:未找到 CMake,请检查路径是否正确
    pause
    exit /b 1
)
if not exist "%CURL_SRC%\CMakeLists.txt" (
    echo 错误:未找到 cURL 源码,请检查路径是否正确
    pause
    exit /b 1
)
if not exist "%OPENSSL_INSTALL%\lib" (
    echo 错误:未找到 OpenSSL 库目录,请检查路径是否正确
    pause
    exit /b 1
)
if not exist "%ZLIB_INSTALL%\lib" (
    echo 错误:未找到 zlib 库目录,请检查路径是否正确
    pause
    exit /b 1
)

echo 开始编译 cURL 静态MT版本...
cd /d "%CURL_SRC%"
:: 修复:强制删除build目录(加rd备用,确保删除干净)
if exist "build" (
    rmdir /s /q "build" >nul 2>&1
    :: 备用删除命令,防止rmdir失败
    rd /s /q "build" >nul 2>&1
)
:: 重建build并进入(确保目录切换成功)
mkdir "build" && cd "build" || (
    echo 错误:创建/进入build目录失败
    pause
    exit /b 1
)
:: 核心修复:CMake命令格式规范(注释移出命令行,^后无任何字符)
"%CMAKE_PATH%" .. ^
 -G "%VS_GENERATOR%" ^
 -A %PLATFORM% ^
 -DCMAKE_INSTALL_PREFIX="%CURL_INSTALL%" ^
 -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded ^
 -DCMAKE_C_FLAGS_RELEASE="/MT /O2" ^
 -DBUILD_SHARED_LIBS=OFF ^
 -DCURL_STATICLIB=ON ^
 -DCURL_USE_OPENSSL=ON ^
 -DOPENSSL_ROOT_DIR="%OPENSSL_INSTALL%" ^
 -DOPENSSL_USE_STATIC_LIBS=ON ^
 -DCURL_ZLIB=ON ^
 -DZLIB_ROOT="%ZLIB_INSTALL%" ^
 -DZLIB_USE_STATIC_LIBS=ON ^
 -DCURL_USE_WINSSL=OFF ^
 -DCURL_USE_LIBPSL=OFF ^
 -DCURL_USE_LIBSSH2=OFF ^
 -DCMAKE_DISABLE_FIND_PACKAGE_Libpsl=ON ^
 -DCMAKE_DISABLE_FIND_PACKAGE_LibSSH2=ON

if %errorlevel% neq 0 (
    echo cURL CMake配置失败
    pause
    exit /b 1
)

"%CMAKE_PATH%" --build . --config Release --target install --parallel 8

if %errorlevel% neq 0 (
    echo cURL 编译失败
    pause
    exit /b 1
)

echo cURL 静态MT版本编译安装完成
echo.

:: 验证编译结果
echo 编译完成,验证产物...
if exist "%CURL_INSTALL%\bin\curl.exe" (
    echo 找到cURL可执行文件:%CURL_INSTALL%\bin\curl.exe
    echo ------------------------------------------------------
    "%CURL_INSTALL%\bin\curl.exe" --version
    echo ------------------------------------------------------
) else (
    echo 未找到cURL可执行文件,编译异常
    pause
    exit /b 1
)

echo.
echo ======================================================
echo cURL 编译完成!静态MT版本输出目录:%CURL_INSTALL%
echo ======================================================
pause

5、build_all.bat 需要再x64 Native Tools Command Prompt for VS 2022里面运行

6、cd到源码目录执行build_all.bat

编译成功结果验证:

7、lib合并命令 libcrypto.lib libssl.lib zlibstatic.lib libcurl.lib合并成一个libcurl.lib

注意:在x64 Native Tools Command Prompt for VS 2022里面运行

bash 复制代码
lib.exe E:\test\curl-8.17.0-static\lib\libcurl.lib E:\test\openssl-1.1.1h-install\lib\libcrypto.lib E:\test\openssl-1.1.1h-install\lib\libssl.lib E:\test\zlib-1.3.1-static\lib\zlibstatic.lib  /out:E:\test\curl-8.17.0-static\lib_merge\libcurl.lib

8、校验LIb是否为MT

bash 复制代码
dumpbin /DIRECTIVES E:\test\openssl-1.1.1h-install\lib\libcrypto.lib
dumpbin /DIRECTIVES E:\test\openssl-1.1.1h-install\lib\libssl.lib
dumpbin /DIRECTIVES E:\test\zlib-1.3.1-static\lib\zlibstatic.lib
dumpbin /DIRECTIVES E:\test\curl-8.17.0-static\lib\libcurl.lib

输出里面有"MT"

a、Dump of file E:\test\zlib-1.3.1-static\lib\zlibstatic.lib

b、Dump of file E:\test\curl-8.17.0-static\lib\libcurl.lib

c、opensll相关lib 编译选项zi 通过命令无法看到

相关推荐
say_fall3 分钟前
C++ 类与对象易错点:初始化列表顺序 / 静态成员访问 / 隐式类型转换
android·java·开发语言·c++
ChoSeitaku29 分钟前
16.C++入门:list|手撕list|反向迭代器|与vector对比
c++·windows·list
Qhumaing35 分钟前
C++学习:【PTA】数据结构 7-1 实验6-1(图-邻接矩阵)
c++·学习·算法
No0d1es36 分钟前
2025年12月 GESP CCF编程能力等级认证C++一级真题
开发语言·c++·青少年编程·gesp·ccf
2301_7737303142 分钟前
系统编程—在线商城信息查询系统
c++·html
郝学胜-神的一滴43 分钟前
深入理解Linux中的Try锁机制
linux·服务器·开发语言·c++·程序人生
散峰而望1 小时前
【算法竞赛】顺序表和vector
c语言·开发语言·数据结构·c++·人工智能·算法·github
三两肉1 小时前
深入理解 HTTPS RSA 握手:从原理到流程的完整解析
网络协议·http·https·rsa·tls四次握手
cpp_25012 小时前
B3927 [GESP202312 四级] 小杨的字典
数据结构·c++·算法·题解·洛谷
Cx330❀2 小时前
《C++ 递归、搜索与回溯》第2-3题:合并两个有序链表,反转链表
开发语言·数据结构·c++·算法·链表·面试