curl / Mailing Lists / curl-library / Single Mail
Buy commercial curl support from WolfSSL. We help you work out your issues, debug your libcurl applications, use the API, port to new platforms, add new features and more. With a team lead by the curl founder himself.

Re: libcurl build from source with openssl

From: Ray Satiro via curl-library <curl-library_at_cool.haxx.se>
Date: Wed, 24 Feb 2021 23:16:01 -0500

On 2/24/2021 5:24 PM, Nir Azkiel via curl-library wrote:
> This is the cmake file for the libcurl:
>
>     include(ExternalProject)
>     message(STATUS "Building libcurl enabled")
>
>     set(CURL_FLAGS -DBUILD_CURL_EXE=OFF -DBUILD_SHARED_LIBS=OFF
> -DUSE_WIN32_LDAP=OFF -DHTTP_ONLY=ON -DCURL_ZLIB=OFF
> -DCURL_DISABLE_CRYPTO_AUTH=ON -DCMAKE_USE_LIBSSH2=OFF
> -DBUILD_TESTING=OFF )
>     if (WIN32)
>         set(CURL_FLAGS ${CURL_FLAGS} -DCURL_STATIC_CRT=ON )
>     endif()
>
>     if (APPLE)
>         set(CURL_FLAGS ${CURL_FLAGS} -DCMAKE_USE_SECTRANSP=ON )
>     elseif(WIN32)
>         set(CURL_FLAGS ${CURL_FLAGS} -DCMAKE_USE_SCHANNEL=ON )
>     else()
>         set(CURL_FLAGS ${CURL_FLAGS} -DCMAKE_USE_OPENSSL=ON )
>     endif()
>
>     ExternalProject_Add(
>         libcurl
>         PREFIX libcurl
>         GIT_REPOSITORY "https://github.com/curl/curl.git
> <https://github.com/curl/curl.git>"
>         GIT_TAG "2f33be817cbce6ad7a36f27dd7ada9219f13584c" # curl-7_75_0
>         SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/third-party/libcurl
>         CMAKE_ARGS  -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
>                     -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
>                     -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
> -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}
> -DCMAKE_C_FLAGS_MINSIZEREL=${CMAKE_C_FLAGS_MINSIZEREL}
> -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}
> -DCMAKE_C_FLAGS_RELWITHDEBINFO=${CMAKE_C_FLAGS_RELWITHDEBINFO}
> -DCMAKE_CXX_STANDARD_LIBRARIES=${CMAKE_CXX_STANDARD_LIBRARIES}
> -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/libcurl/libcurl_install
>                     -DCMAKE_INSTALL_LIBDIR=lib
> -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
>                     -DANDROID_ABI=${ANDROID_ABI}
>                     -DANDROID_STL=${ANDROID_STL} ${CURL_FLAGS}
>         UPDATE_COMMAND ""
>         PATCH_COMMAND ""
>         TEST_COMMAND ""
>     )
>
>     set(CURL_DEBUG_TARGET_NAME "libcurl-d")
>     set(CURL_RELEASE_TARGET_NAME "libcurl")
>     add_library(curl INTERFACE)
>     add_definitions(-DCURL_STATICLIB) # Mandatory for building libcurl
> as static lib
>
>     target_include_directories(curl INTERFACE
> $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/libcurl/libcurl_install/include>)
>
>     # libcurl require ws2_32.lib for windows only
>     if (WIN32)
>         target_link_libraries(curl INTERFACE ws2_32.lib crypt32.lib)
>     else(NOT APPLE)
>         set(OPENSSL_USE_STATIC_LIBS TRUE)
>         find_package(OpenSSL REQUIRED)
>       target_link_libraries(curl INTERFACE OpenSSL::SSL OpenSSL::Crypto)
>     endif()
>
>     target_link_libraries(curl INTERFACE debug
> ${CMAKE_CURRENT_BINARY_DIR}/libcurl/libcurl_install/lib/${CURL_DEBUG_TARGET_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX})
>     target_link_libraries(curl INTERFACE optimized
> ${CMAKE_CURRENT_BINARY_DIR}/libcurl/libcurl_install/lib/${CURL_RELEASE_TARGET_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX})
>
>
>
> on my application cmake I have this :
>
>         add_dependencies(rs-depth-quality libcurl)
>         target_link_libraries(rs-depth-quality curl)
>
>
>
> The yellow line is in charge of adding the linkage to the curl dependency
>
> The green line add the curl project with it's depedency to my application.
>
> It works on Win /Linux /OSX without SSL, with the SSL addition it
> works on Win but Linux and OSX complains about linkage errors .
>
> Thanks
>
> On Wed, Feb 24, 2021 at 11:13 PM Ray Satiro via curl-library
> <curl-library_at_cool.haxx.se <mailto:curl-library_at_cool.haxx.se>> wrote:
>
> On 2/24/2021 9:40 AM, Nir Azkiel via curl-library wrote:
>> I got libcurl downloaded and build, I would like to add HTTPS
>> support but I keep getting linkage errors.
>>
>> I added this flag to libcurl Externalproject_Add
>> -DCMAKE_USE_OPENSSL=ON
>>
>> also I added link to ssl like this
>>
>> set(OPENSSL_USE_STATIC_LIBS TRUE)
>> find_package(OpenSSL REQUIRED)
>> target_link_libraries(curl INTERFACE OpenSSL::SSL OpenSSL::Crypto).
>>
>> I am using libcurl latest release : 7.75
>>
>> My configure step find the ssl package:
>> Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.a (found
>> version "1.0.2g")
>> I keep getting linkage errors like this:
>> ../../libcurl/libcurl_install/lib/libcurl.a(openssl.c.o): In
>> function `ossl_log_tls12_secret':
>> 3703/home/travis/build/Nir-Az/librealsense/build/third-party/libcurl/lib/vtls/openssl.c:270:
>> undefined reference to `SSL_get_session'
>> 3704../../libcurl/libcurl_install/lib/libcurl.a(openssl.c.o): In
>> function `ossl_strerror':
>> 3705/home/travis/build/Nir-Az/librealsense/build/third-party/libcurl/lib/vtls/openssl.c:354:
>> undefined reference to `ERR_error_string_n'
>
>
> ERR_error_string_n is in libcrypto so I think your project is not
> including it. Maybe it is the INTERFACE dependency specification?
> OTOH we are a bit unfamiliar with cmake. Can you give us a minimal
> sample cmake project that can be used to reproduce?
>
>

Please don't top-post, it makes the conversation hard to follow [1]. I
was able to reproduce using cmake's demo project [2]. It looks like the
problem is library order. To reproduce I added appended to
Hello/CMakeLists.txt this

add_dependencies(Hello libcurl)
target_link_libraries(Hello curl)

.. then I appended the content from your cmake file for libcurl. I had
the same errors in Ubuntu 16. I ran make VERBOSE=1 and saw that the
OpenSSL libraries were included before the libcurl library:

/usr/bin/c++      CMakeFiles/helloDemo.dir/demo.cxx.o
CMakeFiles/helloDemo.dir/demo_b.cxx.o  -o helloDemo -rdynamic
../Hello/libHello.a /usr/lib/x86_64-linux-gnu/libssl.a
/usr/lib/x86_64-linux-gnu/libcrypto.a
../Hello/libcurl/libcurl_install/lib/libcurl.a

I changed that around and added dl and pthread (since this is a static
link of OpenSSL that is necessary) I was able to get it to build.

/usr/bin/c++      CMakeFiles/helloDemo.dir/demo.cxx.o
CMakeFiles/helloDemo.dir/demo_b.cxx.o  -o helloDemo -rdynamic
../Hello/libHello.a ../Hello/libcurl/libcurl_install/lib/libcurl.a
/usr/lib/x86_64-linux-gnu/libssl.a /usr/lib/x86_64-linux-gnu/libcrypto.a
-ldl -lpthread

The cmake equivalent changes would mean OpenSSL libs are included after
libcurl:

target_link_libraries(curl INTERFACE debug
${CMAKE_CURRENT_BINARY_DIR}/libcurl/libcurl_install/lib/${CURL_DEBUG_TARGET_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX})
target_link_libraries(curl INTERFACE optimized
${CMAKE_CURRENT_BINARY_DIR}/libcurl/libcurl_install/lib/${CURL_RELEASE_TARGET_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX})
target_link_libraries(curl INTERFACE OpenSSL::SSL OpenSSL::Crypto)
target_link_libraries(curl INTERFACE dl pthread)

You'd have to adjust that for your project but basically that's the
idea. I must reiterate I don't know much cmake. There are a few that do
know and hopefully they can chime in here. AFAICT this isn't a libcurl
problem. We can't be responsible for static linking dependencies.


[1]: https://curl.se/mail/etiquette.html#Do_Not_Top_Post
[2]: https://cmake.org/examples/



-------------------------------------------------------------------
Unsubscribe: https://cool.haxx.se/list/listinfo/curl-library
Etiquette: https://curl.se/mail/etiquette.html
Received on 2021-02-25