【问题标题】:How to compile gSoap with ssl enabled on windows?如何在 Windows 上启用 ssl 编译 gSoap?
【发布时间】:2013-04-11 17:45:21
【问题描述】:

我正在尝试构建支持 ssl 的 gSoap 二进制文件。我已经从这个网站下载了最新的 gSoap 和 WIN32 openssl 二进制文件:http://slproweb.com/products/Win32OpenSSL.html

根据gSoap documentation,我必须使用启用 DWITH_OPENSSL 选项的标准过程进行编译。我认为最自然的选择是你使用 minGW,但我对这个工具没有什么经验。当我尝试这个时,(在应用this patch 之后,我留下了两个缺少的库一个链接时间:-lssl 和 -lcrypto。

我想我必须在编译指令中添加一个 -L 选项,但我在 openssl lib 文件夹中看不到任何 libssl 或 libcrypto(应该是 .a 还是 .lib ?)。我必须重新编译这些还是我错过了什么?

【问题讨论】:

    标签: c++ windows mingw gsoap


    【解决方案1】:

    是的,据我所知,如果您使用minGW 1st off install openssl 然后添加路径 + 标志,如下例所示:

    gcc -I/include/
    -I/local/include
    -L/local/lib
         -o download_file download_file.c  -llibcurl -lcurl  
    

    这里我编译基本的C文件。

    或者如果你运行./configure,添加这样的标志:

    LDFLAGS+="-L/local/lib -lcurl"  LIBS+=-I/local/include ....
    

    【讨论】:

      【解决方案2】:

      好的,我终于成功了,这是我使用的不同步骤:

      1. 首先,我必须使用 mingw 重新构建 openssl,因为 Shining Light Production 提供的二进制文件不附带静态库。我把 openssl 文件夹放在 c:/openssl/

      2. 然后,在 stdsoap2.h 中,我将第 2247 行更改为:

        #if defined(WIN32) && !defined(__MINGW32__)
        #define soap_strtoll _strtoi64
        #else
        # define soap_strtoll strtoll
        #endif
        
        #if defined(WIN32) && !defined(__MINGW32__)    
        # define soap_strtoull _strtoui64
        #else
        # define soap_strtoull strtoull
        #endif
        
      3. 在配置文件中:

        • 我删除了所有出现的 -DWITH_GZIP 和 -lz。
        • 我添加了 -lws2_32 链接器选项(我认为支持 winsocket) 配置文件中的这些更改位于第 7338-7347 行:

          WSDL2H_EXTRA_FLAGS="-DWITH_GNUTLS"
          WSDL2H_EXTRA_LIBS="-lgnutls -lgcrypt -lgpg-error"
          SAMPLE_SSL_LIBS="-lgnutls -lgcrypt -lgpg-error"
          WSDL2H_SOAP_CPP_LIB="libgsoapssl++.a"
          else
          { echo "$as_me:$LINENO: result: no" >&5
          echo "${ECHO_T}no" >&6; }
          WSDL2H_EXTRA_FLAGS="-DWITH_OPENSSL"
          WSDL2H_EXTRA_LIBS="-lssl -lcrypto -lws2_32"
          SAMPLE_SSL_LIBS="-lssl -lcrypto -lws2_32"
          
      4. 我在 mingw 中运行 configure 添加了正确的 LDFLAGS 和 CXXFLAGS,即:

        LDFLAGS+=" -L/c/openssl/ -L/c/MinGW/lib/" CXXFLAGS+=" -I/c/openssl/include/" ./configure
        
      5. 我运行 make 并交叉手指!

      【讨论】:

      • +1 用于回复私人问题。无论如何,有时我使用 MAC 编译一些东西,然后复制回 Windows。 minGW 有很多问题,但大多数都有解决方法
      【解决方案3】:

      您还可以使用更“原生”的方式,即。 Visual Studio C 编译器。然而,这不是很简单。

      首先,编译 openssl(对 VS 2015 Community Edition 有效,但我相信任何 2015 都可以):

      • 下载openssl源码,解压到某个文件夹
      • 下载 PERL for windows(ActivePerl 或 Straberry Perl - 这个是免费的)并安装
      • 从菜单开始打开“打开 Visual Studio 2015 工具命令提示符”
      • cd 到 openssl 未压缩的源文件夹

      在那里运行以下命令(这组使用的是不带汇编器的版本):

      perl Configure VC-WIN32 no-asm --prefix=c:\some\openssl\dir
      ms\do_ms
      nmake -f ms\ntdll.mak
      nmake -f ms\ntdll.mak test - optional step
      nmake -f ms\ntdll.mak install
      

      之后,您的 openssl 产品安装在 c:\some\openssl\dir

      接下来,要编译支持 SSL 的基于 gSoap 的应用程序,您必须添加以下设置(所有设置都在 Visual Studio 中的“项目->属性”中完成):

      • C/C++ --> 常规,在 Additional Include Directories 中,将“c:\some\openssl\dir\include”文件夹添加到列表中
      • C/C++ --> 命令行,在“附加选项”框中输入:/DWITH_OPENSSL
      • 链接器 --> 输入,附加依赖:将“c:\some\openssl\dir\lib\libeay32.lib”和“c:\some\openssl\dir\lib\sskeay32.lib”添加到列表中

      如果您使用 wsdl2h.exe 和 soapcpp2.exe 工具生成了类,那么您就差不多完成了。 验证您的 stdsoap2.cpp 文件是否包含这些行:

      #include <openssl\ssl.h>
      #include <openssl\rsa.h>
      

      如果没有,您可以在第一个 #ifdef WITH_OPENSSL 之后添加它们

      这就是我的项目的全部内容。我可以使用 VC2015 编译并像任何其他应用程序一样运行/调试。

      祝你好运。

      【讨论】:

      • 我认为这不能回答他的问题。他的第一句话是“我正在尝试构建支持 ssl 的 gSoap 二进制文件”,但您的回答涉及如何使用 gSoap 和 SSL 编译应用程序。他需要构建 gsoap 二进制文件(即:soapcpp2.exe 和 wsdl2h.exe),因为与 gsoap 一起分发的二进制文件不支持 Windows 的 SSL(很遗憾)。例如,onvif.org/onvif/ver10/wsdl/devicemgmt.wsdl 位于 SSL 服务器上,所以如果你用它调用 wsdl2h.exe,它会失败,说不支持 SSL/TLS。
      猜你喜欢
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 2012-03-14
      • 2012-10-19
      • 2017-02-21
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多