【问题标题】:How do you compile OpenSSL for x64?你如何为 x64 编译 OpenSSL?
【发布时间】:2010-09-14 13:36:31
【问题描述】:

按照 INSTALL.W64 中的说明操作后,我遇到了两个问题:

  • 代码仍写入“out32”文件夹。我需要能够在我的工作站上链接到 32 位和 64 位版本的库,所以我不希望 64 位版本破坏 32 位库。
  • 输出仍然是 32 位!这意味着我在尝试从 x64 应用链接到库时收到“未解析的外部符号”错误。

【问题讨论】:

    标签: c++ c windows 64-bit win64


    【解决方案1】:

    要编译静态库(发布和调试),您需要这样做:

    1. 安装 Perl - www.activestate.com
    2. 运行“Visual Studio 2008 x64 Cross Tools 命令提示符”(注意:常规命令提示符将不起作用。)
    3. 配置为 perl 配置VC-WIN64A no-shared no-idea
    4. 运行:ms\do_win64a
    5. 编辑 ms\nt.mak 并将输出目录中的“32”更改为“64”:
    # 所有有趣的东西的输出目录 OUT_D=out64.dbg # 所有临时垃圾的输出目录 TMP_D=tmp64.dbg # 头文件的输出目录 INC_D=inc64 INCO_D=inc64\openssl
    1. 如果遇到错误,请编辑 ms\nt.mak 并从 EX_LIBS 中删除 bufferoverflowu.lib。
    2. 运行:nmake -f ms\nt.mak
    3. 编辑 ms\do_win64a 文件并将“debug”添加到所有行,“ml64”和最后两行除外
    4. 运行:ms\do_win64a
    5. 重复步骤 4 和 5
    6. 编辑 ms\nt.mak 文件并将 /Zi 添加到 CFLAG 列表中!
    7. 运行:nmake -f ms\nt.mak

    【讨论】:

    • 看来输出仍然命名为*32.liblibeay32.dllssleay32.dll)。是名称错误还是我没有正确遵循这些说明?
    • "Visual Studio 2008 x64 Cross Tools 命令提示符" > 在哪里可以找到这个? (我用的是我这边的VS 2015)
    • @NicoAD 下载并安装 Build Tools for Visual Studio visualstudio.com/downloads/#vstool-2017
    【解决方案2】:

    我通过这种方式解决了这个问题,使用的是 1.0.1c 源代码:

    将此块添加到util/pl/VC-32.pl,就在$o='\\'; 行之前。

    if ($debug)
        {
        $ssl .= 'd';
        $crypto .= 'd';
        }
    

    将此块添加到util/pl/VC-32.pl,就在if ($debug) 行之前。

    if ($FLAVOR =~ /WIN64/)
        {
        $out_def =~ s/32/64/;
        $tmp_def =~ s/32/64/;
        $inc_def =~ s/32/64/;
        }
    

    然后构建所有品种:

    setenv /x86 /release
    perl Configure VC-WIN32  --prefix=build -DUNICODE -D_UNICODE
    ms\do_ms
    nmake -f ms\ntdll.mak
    
    setenv /x64 /release
    perl Configure VC-WIN64A --prefix=build
    ms\do_win64a.bat
    nmake -f ms\ntdll.mak
    
    setenv /x86 /debug
    perl Configure debug-VC-WIN32  --prefix=build -DUNICODE -D_UNICODE
    ms\do_ms
    move /y ms\libeay32.def ms\libeay32d.def
    move /y ms\ssleay32.def ms\ssleay32d.def
    nmake -f ms\ntdll.mak
    
    setenv /x64 /debug
    perl Configure debug-VC-WIN64A --prefix=build
    ms\do_win64a.bat
    move /y ms\libeay32.def ms\libeay32d.def
    move /y ms\ssleay32.def ms\ssleay32d.def
    nmake -f ms\ntdll.mak
    

    【讨论】:

      【解决方案3】:

      使用Conan。安装和使用非常简单。

      您可以请求准备好使用的文件。例如对于 Linux x64 或与 Visual Studio 2012 一起使用。这里有一个示例说明:

      conan install OpenSSL/1.0.2g@lasote/stable -s arch="x86_64" -s build_type="Debug" -s compiler="gcc" -s compiler.version="5.3" -s os="Linux" -o 386="False" -o no_asm="False" -o no_rsa="False" -o no_cast="False" -o no_hmac="False" -o no_sse2="False" -o no_zlib="False" ...

      【讨论】:

        【解决方案4】:

        根据官方文档:

        “您可能会感到惊讶:64 位人工制品确实在 out32* 子目录中输出,并且名称以 *32.dll 结尾。事实是 64 位编译目标到目前为止是对旧版 32 位 Windows 目标的增量更改. 许多编译标志仍然标记为“32”,尽管它们确实适用于 32 位和 64 位目标。”

        因此不再需要第一个答案。

        说明可以在这里找到:

        https://wiki.openssl.org/index.php/Compilation_and_Installation#W64

        【讨论】:

          【解决方案5】:

          在撰写本指南时,OpenSSL 的最新版本是 1.1.1a。

          环境:

          • Windows 10
          • MS Visual Studio 2017

          先决条件:

          确保 Perl 和 NASM 都在 PATH 环境变量中。

          编译 x64:

          1. 打开 x64 Native Tools 命令提示符
          2. perl 配置 VC-WIN64A --prefix=e:\projects\bin\OpenSSL\vc-win64a --openssldir=e:\projects\bin\OpenSSL\SSL
          3. nmake
          4. nmake 测试
          5. nmake 安装

          第 4 步是可选的。

          编译 x86:

          1. 打开 x86 Native Tools 命令提示符
          2. perl 配置 VC-WIN32 --prefix=e:\projects\bin\OpenSSL\vc-win32 --openssldir=e:\projects\bin\OpenSSL\SSL
          3. nmake
          4. nmake 测试
          5. nmake 安装

          第 4 步是可选的。

          【讨论】:

            【解决方案6】:

            如果您在 cygwin 中构建,则可以使用以下脚本,假设 MSDEVPATH 已设置为您的 Visual Studio 目录

             echo "Building x64 OpenSSL"
             # save the path of the x86 msdev
             MSDEVPATH_x86=$MSDEVPATH
             # and set a new var with x64 one
             MSDEVPATH_x64=`cygpath -u $MSDEVPATH/bin/x86_amd64`
            
             # now set vars with the several lib path for x64 in windows mode
             LIBPATH_AMD64=`cygpath -w $MSDEVPATH_x86/lib/amd64`
             LIBPATH_PLATFORM_x64=`cygpath -w $MSDEVPATH_x86/PlatformSDK/lib/x64`
             # and set the LIB env var that link looks at
             export LIB="$LIBPATH_AMD64;$LIBPATH_PLATFORM_x64"
            
             # the new path for nmake to look for cl, x64 at the start to override any other msdev that was set previously
             export PATH=$MSDEVPATH_x64:$PATH
            
             ./Configure VC-WIN64A zlib-dynamic --prefix=$OUT --with-zlib-include=zlib-$ZLIB_VERSION/include --with-zlib-lib=zlib-$ZLIB_VERSION/x64_lib
            
             # do the deed
             ms/do_win64a.bat
             $MSDEVPATH_x86/bin/nmake -f ms/ntdll.mak  ${1:-install}
            

            【讨论】:

              【解决方案7】:

              自最初提出此问题以来,构建说明已更改。可以在here 找到新的说明。请注意,您需要安装 perl 和 NASM,并且需要使用开发人员命令提示符。

              【讨论】:

                【解决方案8】:

                你也可以使用MSYS+mingw-w64:

                1) 下载并解压 msys 到 C:\msys
                2) 下载mingw-w64并解压到c:\mingw64
                3) 运行 msys 安装后脚本。当它要求您安装 mingw 时,将其指向 C:\mingw64\bin
                4) 提取一个openssl 每日快照(1.0.0 版本有一个bug)。在源目录运行 配置 mingw64
                制作
                进行检查
                进行安装
                5) openssl 安装到/local/

                【讨论】:

                  猜你喜欢
                  • 2011-02-14
                  • 2010-09-14
                  • 2018-04-09
                  • 2019-03-14
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-12-03
                  • 2017-01-21
                  相关资源
                  最近更新 更多