OpenSSL源码在Win下编译报错-LNK2005/fatal error LNK1169

错误详情:

IF EXIST .manifest DEL /F /Q .manifest
        IF EXIST libcrypto-1_1.dll DEL /F /Q libcrypto-1_1.dll
        link /nologo /debug /dll  /nologo /debug  /implib:libcrypto.lib /out:libcrypto-1_1.dll /def:libcrypto.def @C:\Users\admin\AppData\Local\Temp\nmD3D7.tmp || (DEL /Q libcrypto-1_1.* libcrypto.lib && EXIT 1)
bn-586.obj : error LNK2005: _OPENSSL_ia32cap_P 已经在 aesni-x86.obj 中定义
x86-gf2m.obj : error LNK2005: _OPENSSL_ia32cap_P 已经在 aesni-x86.obj 中定义
x86-mont.obj : error LNK2005: _OPENSSL_ia32cap_P 已经在 aesni-x86.obj 中定义
chacha-x86.obj : error LNK2005: _OPENSSL_ia32cap_P 已经在 aesni-x86.obj 中定义
ecp_nistz256-x86.obj : error LNK2005: _OPENSSL_ia32cap_P 已经在 aesni-x86.obj 中定义
poly1305-x86.obj : error LNK2005: _OPENSSL_ia32cap_P 已经在 aesni-x86.obj 中定义
rc4-586.obj : error LNK2005: _OPENSSL_ia32cap_P 已经在 aesni-x86.obj 中定义
sha1-586.obj : error LNK2005: _OPENSSL_ia32cap_P 已经在 aesni-x86.obj 中定义
sha256-586.obj : error LNK2005: _OPENSSL_ia32cap_P 已经在 aesni-x86.obj 中定义
sha512-586.obj : error LNK2005: _OPENSSL_ia32cap_P 已经在 aesni-x86.obj 中定义
x86cpuid.obj : error LNK2005: _OPENSSL_ia32cap_P 已经在 aesni-x86.obj 中定义
  正在创建库 libcrypto.lib 和对象 libcrypto.exp
libcrypto-1_1.dll : fatal error LNK1169: 找到一个或多个多重定义的符号
NMAKE : fatal error U1077: “link”: 返回代码“0x1”
Stop.
NMAKE : fatal error U1077: “"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"”: 返回代码“0x2”
Stop.

出现错误原因:

        第一次在电脑上按照网上说的流程:

        1、perl Configure VC-WIN32

        2、nmake

        3、nmake test

        4、nmake   install

        执行完之后是正常的,然后直接删除了整个openssl目录,下载另外一个版本的源码进行编译,走到nmake那一步一直报上面的错误,不管是使用那个版本的源码都不行。

处理办法:

       删除openssl整个目录,重新解压下载的源码文件。使用如下的步骤编译成功:

       1、#进入源码目录
               cd D:\Source\openssl\openssl-1.1.1g
           #设置配置
           #32位, 需要使用32的命令编辑器进行编译
       2、perl Configure VC-WIN32 no-asm --prefix="D:\Source\openssl\Lib111g\X86"
          #64位, 需要使用64的命令编辑器进行编译
          #perl Configure VC-WIN64A no-asm --prefix="D:\Source\openssl\Lib111g\X64"
       3、nmake
         #可选,测试编译的效果是否成功
         nmake test
         nmake install

        4、执行完成后,压缩一份生成的文件,目录D:\Source\openssl\Lib111g\X86,里面包含include文件夹、lib文件夹和bin文件夹

        5、执行nmake  clean清除编译后生成的临时文件。

原因分析:

        通过比较两次的编译执行脚本发现,在执行成功的编译脚本里面添加了 no-asm 编译选项(不生成二进制文件),得出如下的结论:

        在第一次成功安装完Openssl后并没有执行清除操作,导致系统中保留了第一次编译后生成的临时文件,因此清除整个目录。

        编译二进制文件(去掉编译选项no-asm),在链接的时候*.obj文件中存在了相同名称的定义_OPENSSL_ia32cap_P,打开报错的文件中搜索这个到处函数名,发现在所有的报错的文件中都有&external_label("OPENSSL_ia32cap_P");这个定义,导致出现在编译的临时文件中出现重定义的现象。

你可能感兴趣的:(Openssl)