Building libcurl with SSL support on Windows

前端 未结 10 2167
眼角桃花
眼角桃花 2020-11-27 12:12

I\'m using libcurl in a Win32 C++ application.

I have the curllib.vcproj project added to my solution and set my other projects to depend on it.

How do I bui

相关标签:
10条回答
  • 2020-11-27 12:23

    When compiling OpenSSL 1.0.0 on Windows with Visual Studio 2010, it eventually threw a 0x2 error:

    NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 10.0 \VC\BIN\cl.EXE"' : return code '0x2'

    Stop.

    It seems that this error will be thrown because of a flag in the perl Configure file, namely -WX. As the MSDN documentation states:

    Treats all compiler warnings as errors. For a new project, it may be best to use /WX in all compilations; resolving all warnings will ensure the fewest possible hard-to-find code defects.

    After removing the -WX occurrences in the Configure file and re-entering the commands stated here it built fine and passed all tests.

    0 讨论(0)
  • 2020-11-27 12:23

    Couple of notes in response to and/or in addition to the above..

    First, if you don't want to mess with ActivePerl, Strawberry Perl is terrific and worked perfectly for this.

    Second, in lieu of using do_ms.bat, I would recommend preferring do_masm if possible since, according to INSTALL.W32,

    This is worth doing because it will result in faster code: for example it will typically result in a 2 times speedup in the RSA routines.

    Also, build 0.9.8l (L) of OpenSSL was a nightmare so I eventually gave up and reverted to 0.9.8k which built and linked (statically) with libcurl 1.9 without issue.

    0 讨论(0)
  • 2020-11-27 12:26

    In my case follow the curl README file was enough.
    My configuration is the following:

    • Visual Studio 2015 (VC14)
    • Static library
    • Win64
    • curl version 7.57.0
    • OpenSSL 1.0.2

    Compilation of libCurl

    1. Download libcurl source there: https://curl.haxx.se/download.html
    2. Uncompress the file and go to the folder curl-7.57.0\projects
    3. Open the README file and follow the instructions, this lead me to do the following:
      • Downloaded OpenSSL
      • Extract it and rename it to openssl, put it aside the curl folder, this is important as you'll open the VS project that expect to find openssl there.
      • Install Perl
      • Execute the utility build-openssl.bat to perform the compilation of openSSL. With my settings this became the following:
        .\build-openssl.bat vc14 x64 release ..\..\openssl\
        just runs .\build-openssl.bat -help to know more about the parameters.
        After that you can see OpenSSL has been compiled as you got a new folder here: openssl\build\Win64
    4. Open the Visual Studio project curl-7.57.0\projects\Windows\VC14\curl-all.sln
    5. Be sure to set the visual studio project to the build configuration you need (LIB Release - LIB OpenSSL in my case)
    6. Build all
    7. The library is located at curl-7.57.0\build\Win64\VC14\LIB Release - LIB OpenSSL\libcurl.lib

    Remarks

    • Don't forget to define the CURL_STATICLIB preprocessor in your own project
    • With static library, you will have to links with the dependencies of libcurl, see this answer
    • You might not want to depend on LDAP, in that case you can disable it by setting the preprocessor CURL_DISABLE_LDAP before you compile libcurl.
    0 讨论(0)
  • 2020-11-27 12:26

    How to build libcurl C/C++ with OpenSSL (SSL support) on Windows

    1. Install libcurl
    2. Install OpenSSl
    3. Build libcurl with OpenSSL

    Installing libcurl

    Go to the download page of libcurl and donwnload the ZIP file under Source Archives. In my case it is called curl-7.58.0.zip

    Extract the archive and open projects/Windows/VC15/curl_all.sln with Visual Studio.

    Installing OpenSSL

    Download the windows binary of OpenSSL. In my case, I downloaded the windows installer file Win32 OpenSSL v1.1.0g from the Shining Light Productions distribution.

    The installation folder for me is C:\OpenSSL-Win32.

    Building libcurl with OpenSSL

    In the curl_all.sln Visual Studio solution file, change the build configuration to DLL Debug - DLL OpenSSL.

    In the Solution Explorer, right click the project curl and go to Properties.

    Under Linker -> General modify Additional Library Directories and add the path to your OpenSSL directory + \lib. In my case, this is C:\OpenSSL-Win32\lib.

    Apply and close the properties window.

    Right click the project libcurl and do the same as the previous step, add OpenSSL directory + \lib to Additional Library Directories under Linker -> General.

    Under C/C++ -> General, add C:\OpenSSL-Win32\include to the Additional Include Directories.

    Finally go to Linker -> Input and modify Additional Dependencies. Replace all the lib files to the following:

    ws2_32.lib
    wldap32.lib
    openssl.lib
    libssl.lib
    libcrypto.lib
    

    Apply and close the properties window.

    With the DLL Debug - DLL OpenSSL build configuration still selected, go to Build -> Build Solution.

    Copy the two dll files libcrypto-1_1.dll and libssl-1_1.dll from the OpenSSL bin directory (C:\OpenSSL-Win32\bin) to the just created build directory curl-7.58.0\build\Win32\VC15\DLL Debug - DLL OpenSSL.

    Validating Build

    Inside the build directory, run curld.exe. If it runs with no errors (missing dll, etc.) then your build was successful.

    0 讨论(0)
  • 2020-11-27 12:28

    Well, since this post failed badly, I had to dig into the matter myself.

    Also check out the other answers and comments for additional info regarding other versions etc.

    EDIT: Since I posted this Q there seems to be ready-built binaries made available from the curl homepage. Check out James' answer.

    So here goes:

    -

    Preprocessor

    The following two symbols need to be fed to the preprocessor to enable SSL for libcurl:

    USE_SSLEAY
    USE_OPENSSL
    

    (libcurl uses OpenSSL for SSL support)

    Alternatively the symbols can be added directly to a file called setup.h in libcurl, but I'm not too happy about modifying code in 3rd party distributions unless I really have to.

    Rebuilding the libcurl library, I now got some errors about OpenSSL include files not being found. Naturally, since I haven't set up the OpenSSL distribution properly yet.

    Compiling OpenSSL binaries

    I downloaded the OpenSSL 0.9.8 source distribution and unpacked it.

    In the root of the source distribution there's a file called INSTALL.W32 which describes how to compile the OpenSSL binaries. The build chain requires perl, so I installed the latest version of ActivePerl.

    I had some trouble with the build, which might not be applicable to all systems, but I'll go through it here in case somebody experiences the same.

    According to INSTALL.W32:

    Run the following commandline tasks with current directory set to the source distribution root:

    1> perl Configure VC-WIN32 --prefix=c:/some/openssl/dir
    

    (Where "c:/some/openssl/dir" should be replaced by the dir where OpenSSL should be installed. Don't use spaces in this path. The compilation further ahead will fail in that case)

    2> ms\do_ms
    

    For me this step was unsuccessful at first, since I lacked the environment variables OSVERSION and TARGETCPU. I set these to 5.1.2600 and x86 respectively. You may get complaint about OSVERSION being "insane", but look closer, this error is for WinCE and doesn't affect the Win32 setup. To get hold of your OS version, run the 'ver' command from a command prompt or run winver.exe.

    3> nmake -f ms\nt.mak (for static library)
    

    or

    3> nmake -f ms\ntdll.mak (for DLL)
    

    The source now compiles. Took approx 5 minutes on my laptop.

    When compilation is completed, the libs or binaries have been placed in:

    distroot/out32 - for static library build

    or

    distroot/out32dll - for DLL build

    Building and linking

    Now, back to visual studio and point out the libs and include path for headers. The include files are located in distroot/inc32/openssl.

    Remember to add libeay32.lib and ssleay32.lib as linker input.

    Rebuild the libcurl project.

    Error!

    Well at least for me with this version of OpenSSL. it complained about a struct typedef in one of the OpenSSL headers. I couldn't find any info on this. After an hour of googling I broke my own principle and commented out the typedef from the OpenSSL header, and luckily libcurl wasn't using that symbol so it built fine.

    Update: As pointed out by Jason, this issue seems to have dissapeared as of version 1.0.0a.

    Now, for confirming that SSL support is enabled for libcurl, run the following code:

    curl_version_info_data * vinfo = curl_version_info( CURLVERSION_NOW );
    if( vinfo->features & CURL_VERSION_SSL )
        // SSL support enabled
    else
        // No SSL
    

    Simple as that.

    0 讨论(0)
  • 2020-11-27 12:38

    If you build with Visual Studio IDE and get 58 odd warnings as the likes of

    "inconsistent dll linkage curl_global_init / curl_msnprintf /..."

    you should add CURL_STATICLIB to the preproccessor definitions.

    so the entire definition line should look like:

    USE_SSLEAY;USE_OPENSSL;CURL_STATICLIB.

    With this all the warning will disappear.

    Some would ignore the warnings and go on using the libs, but then will get corresponding *error*s as the likes of curl_global_init / curl_msnprintf. It can be very annoying.

    Hope it can help somebody.

    0 讨论(0)
提交回复
热议问题