如何编译不依赖VCRuntime的VC-WIN32版OpenSSL 1.1.1c DLL?
哦,我正好熟悉OpenSSL 1.1.x系列的构建变化,你之前在1.0.2里用的手动改mak文件的方法在1.1.x里行不通——因为它的构建系统完全重构了,不过别担心,官方其实提供了更规范的配置方式来指定静态运行时,不用再手动改文件啦!
1. 先初始化VC环境变量
在开始编译前,必须先加载VC2017的32位编译环境:
找到VC2017的vcvars32.bat(通常路径是C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxiliary\Build\vcvars32.bat),打开命令提示符执行这个批处理文件,确保编译器、链接器的路径都正确配置。
2. 使用正确的configure命令
直接通过配置参数指定使用静态运行时,不需要手动修改生成的makefile或configdata.pm:
perl configure VC-WIN32 --release --prefix=C:\your-openssl-output-path -DOPENSSL_USE_STATIC_RUNTIME
VC-WIN32:指定32位Windows编译目标--release:编译Release版本--prefix:设置编译后文件的输出目录-DOPENSSL_USE_STATIC_RUNTIME:这个宏会让OpenSSL自动使用/MT(静态VC运行时)编译,替代默认的/MD(动态运行时)
3. 编译、测试、安装
依次执行以下命令:
nmake nmake test nmake install
这样生成的DLL(比如libcrypto-1_1.dll、libssl-1_1.dll)应该就不会依赖vcruntime140.dll了,你可以用depends.exe再验证一下。
为什么之前手动修改会失败?
OpenSSL 1.1.x的构建系统会通过configdata.pm统一管理所有编译、链接参数,手动替换/MD为/MT只会修改部分参数,测试程序、辅助工具的编译选项可能还是沿用动态运行时,导致链接时出现不兼容,进而引发测试失败。用官方提供的宏参数可以保证整个构建流程的参数一致性。
另外,你提到的no-shared选项确实会生成静态库而非DLL,所以完全不需要用它,上面的配置默认会生成动态链接库(DLL)同时使用静态运行时。
内容的提问来源于stack exchange,提问作者Chris




