编译openssl

准备工作:

安装ActivePerl-5.26.3.2603-MSWin32-x64-a95bce075.exe(strawberry perl也可以)
安装nasm-2.14.02-installer-x64.exe,默认安装至C:\Program Files\NASM,系统环境变量PATH添加C:\Program Files\NASM
下载openssl-OpenSSL_1_1_1-stable.zip
这里为您打包好
电脑已安装VS2013(其它版本没有测试,应该下面第3步的路径改一下就行)

编译x86版本的库:

1、解压openssl-OpenSSL_1_1_1-stable.zip,获得D:\openssl-OpenSSL_1_1_1-stable
2、打开命令行窗口
3、转至C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin,执行vcvars32.bat
4、转至D:\openssl-OpenSSL_1_1_1-stable,执行perl configure VC-WIN32 --prefix="D:\openssl\x86",完了会提示:
Using os-specific seed configuration
Creating configdata.pm
Creating makefile

如果提示ppm install dmake,则先执行ppm install dmake,等待下载完了再执行上面的perl。如果下载失败了,要先把C:\Users\xxx\AppData\Local\ActiveState\ActivePerl里的东西全部删掉,再重新执行ppm

configure后跟着的VC-WIN32代表编译x86的库,--prefix代表安装目录,除此之外,还可以设置debug/release、x64/ia64/wince、静态库等等,具体用法参照Build and Install

5、执行nmake,等待编译完成

6、执行nmake test,最后会提示PASS。运行前记得关闭杀毒软件

7、执行nmake install,将会在D:\openssl\x86生成bin、include、lib三个文件夹,里面只包含了动态库。如果需要静态库,在第4步的时候执行perl configure no-shared VC-WIN32 --prefix="D:\openssl\x86"

注:install中途会拷贝一些文件到C:/Program Files/Common Files/SSL,因此要以管理员运行命令行,否则它会中断install过程

编译x64版本的库:

注:除了个别路径不同,跟x86是一样的,重点看x86的步骤说明

1、解压openssl-OpenSSL_1_1_1-stable.zip,获得D:\openssl-OpenSSL_1_1_1-stable,若在此之前编译过x86的库,请先把openssl-OpenSSL_1_1_1-stable整个文件夹删掉,重新解压一遍
2、打开命令行窗口
3、转至C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64,执行vcvars64.bat
4、转至D:\openssl-OpenSSL_1_1_1-stable,执行perl configure VC-WIN64A --prefix="D:\openssl\x64"
5、执行nmake,等待编译完成
如果中间报错,X64与目标机器X86冲突的错误,就是第3步错了,把命令行重启一下再执行
6、执行nmake test,最后会提示PASS
7、执行nmake install,将会在D:\openssl\x64生成bin、include、lib三个文件夹

VS2019

VS2019也可以安装上面的步骤,区别是vcvars64.bat的路径C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build

nmake test报错问题

2023年重新编译2019年那份源码,发现test阶段报错

        mkdir .\test\test-runs
        set SRCTOP=.
        set BLDTOP=.
        set RESULT_D=.\test\test-runs
        set PERL=C:\Perl64\bin\perl.exe
        set OPENSSL_ENGINES=D:\openssl\src\openssl-OpenSSL_1_1_1-stable\engines
        set OPENSSL_DEBUG_MEMORY=on
        "C:\Perl64\bin\perl.exe" ".\test\run_tests.pl"
test\recipes\01-test_abort.t .................... ok
test\recipes\01-test_sanity.t ................... ok
test\recipes\01-test_symbol_presence.t .......... ok
test\recipes\01-test_test.t ..................... ok
test\recipes\02-test_errstr.t ................... ok
...
test\recipes\80-test_cms.t ...................... Dubious, test returned 4 (wstat 1024, 0x400)
Failed 4/4 subtests
test\recipes\80-test_cmsapi.t ................... ok
test\recipes\80-test_ct.t ....................... ok
test\recipes\80-test_dane.t ..................... ok
test\recipes\80-test_dtls.t ..................... ok
test\recipes\80-test_dtls_mtu.t ................. ok
test\recipes\80-test_dtlsv1listen.t ............. ok
test\recipes\80-test_ocsp.t ..................... ok
test\recipes\80-test_pkcs12.t ................... skipped: Non-Greek system locale
test\recipes\80-test_ssl_new.t .................. Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/28 subtests
test\recipes\80-test_ssl_old.t .................. ok
...
test\recipes\99-test_fuzz.t ..................... ok

Test Summary Report
-------------------
test\recipes\80-test_cms.t                    (Wstat: 1024 Tests: 4 Failed: 4)
  Failed tests:  1-4
  Non-zero exit status: 4
test\recipes\80-test_ssl_new.t                (Wstat: 256 Tests: 28 Failed: 1)
  Failed test:  12
  Non-zero exit status: 1
Files=154, Tests=1428, 426 wallclock secs ( 0.44 usr +  0.06 sys =  0.50 CPU)
Result: FAIL
NMAKE : fatal error U1077: “C:\Perl64\bin\perl.exe”: 返回代码“0x1”
Stop.
NMAKE : fatal error U1077: “"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64\nmake.exe"”: 返回代码“0x2”
Stop.

Github上有人提出该问题Test failure for test_ssl_new due to expired certificates #18456,说是系统时间在2022年1月1日之后就会报错。下载最新版本的源码就可以了官网下载

All tests successful.
Files=159, Tests=2360, 294 wallclock secs ( 0.20 usr +  0.06 sys =  0.27 CPU)
Result: PASS

静态库LNK2019问题

项目调用静态库,编译时报错

1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_ioctlsocket,该符号在函数 BIO_socket_ioctl 中被引用
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_getsockname,该符号在函数 BIO_sock_info 中被引用
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_getsockopt,该符号在函数 BIO_sock_error 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2001: 无法解析的外部符号 __imp_getsockopt
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_ntohs,该符号在函数 BIO_get_port 中被引用
1>libcrypto.lib(b_addr.obj) : error LNK2001: 无法解析的外部符号 __imp_ntohs
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_gethostbyname,该符号在函数 BIO_gethostbyname 中被引用
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_WSAStartup,该符号在函数 BIO_sock_init 中被引用
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_WSACleanup,该符号在函数 bio_sock_cleanup_int 中被引用
1>libcrypto.lib(b_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_WSAGetLastError,该符号在函数 BIO_accept 中被引用
1>libcrypto.lib(bss_sock.obj) : error LNK2001: 无法解析的外部符号 __imp_WSAGetLastError
1>libcrypto.lib(b_sock2.obj) : error LNK2001: 无法解析的外部符号 __imp_WSAGetLastError
1>libcrypto.lib(b_addr.obj) : error LNK2019: 无法解析的外部符号 __imp_getaddrinfo,该符号在函数 BIO_lookup_ex 中被引用
1>libcrypto.lib(b_addr.obj) : error LNK2019: 无法解析的外部符号 __imp_freeaddrinfo,该符号在函数 BIO_ADDRINFO_free 中被引用
1>libcrypto.lib(b_addr.obj) : error LNK2019: 无法解析的外部符号 __imp_getnameinfo,该符号在函数 addr_strings 中被引用
1>libcrypto.lib(bss_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_recv,该符号在函数 sock_read 中被引用
1>libcrypto.lib(bss_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_send,该符号在函数 sock_write 中被引用
1>libcrypto.lib(bss_sock.obj) : error LNK2019: 无法解析的外部符号 __imp_WSASetLastError,该符号在函数 sock_write 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_accept,该符号在函数 BIO_accept_ex 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_bind,该符号在函数 BIO_bind 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_closesocket,该符号在函数 BIO_accept_ex 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_connect,该符号在函数 BIO_connect 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_listen,该符号在函数 BIO_listen 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_setsockopt,该符号在函数 BIO_connect 中被引用
1>libcrypto.lib(b_sock2.obj) : error LNK2019: 无法解析的外部符号 __imp_socket,该符号在函数 BIO_socket 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertOpenStore,该符号在函数 capi_open_store 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertCloseStore,该符号在函数 capi_find_key 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertEnumCertificatesInStore,该符号在函数 capi_find_cert 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertFindCertificateInStore,该符号在函数 capi_find_cert 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertDuplicateCertificateContext,该符号在函数 capi_load_ssl_client_cert 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertFreeCertificateContext,该符号在函数 capi_dsa_free 中被引用
1>libcrypto.lib(e_capi.obj) : error LNK2019: 无法解析的外部符号 __imp_CertGetCertificateContextProperty,该符号在函数 capi_cert_get_fname 中被引用

解决:附加依赖项添加ws2_32.libcrypt32.lib

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CMake是一个跨平台的构建系统,用于自动化管理软件的构建过程,包括依赖项查找、配置选项设置和生成编译指令等。在构建OpenSSL这样的开源项目时,CMake提供了一种标准化的方式来组织和控制构建流程。 以下是使用CMake编译OpenSSL的基本步骤: 1. **获取源代码**: 首先,你需要从OpenSSL官网或其他可靠的源获取OpenSSL的源代码,通常是一个`.tar.gz`或`.zip`文件。 2. **创建CMakeLists.txt**: 创建一个名为`CMakeLists.txt`的文件,这将是CMake配置文件。对于OpenSSL,你可能需要在包含源代码目录中创建这个文件。 3. **配置CMake**: 打开终端或命令提示符,进入源代码目录,然后运行以下命令(假设你已经安装了CMake): ``` cmake . ``` 如果你需要特定的编译选项,如启用或禁用某些模块,可以添加CMake命令行参数,例如: ``` cmake -DOPENSSL_NO_SSL2=ON . ``` 4. **生成构建文件**: 运行 `cmake --generate-commands` 或 `cmake --build .` 来生成编译命令。前者只显示构建步骤,后者会实际执行这些命令。 5. **编译和安装**: 如果你想在当前目录构建库并安装,运行 `cmake --build . --target install`。如果需要构建为动态链接库,而不是静态库,可以指定 `-DCMAKE_BUILD_TYPE=Release` 并使用 `cmake --build . --target install`。 6. **检查安装**: 安装完成后,你可以通过调用`openssl version`来验证安装是否成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值