Vinculación estática de la biblioteca criptográfica OpenSSL en CMake

2 minutos de lectura

avatar de usuario de robert
Roberto

Quiero vincular estáticamente las bibliotecas enumeradas a continuación:

set_target_properties(exec PROPERTIES LINK_SEARCH_START_STATIC 1)
set_target_properties(exec PROPERTIES LINK_SEARCH_END_STATIC 1)
set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})

find_library(SODIUM_LIB libsodium.a REQUIRED)
find_library(SSL_LIB libssl.a REQUIRED)
find_library(CRYPTO_LIB libcrypto.a REQUIRED)
find_library(DL_LIB libdl.a REQUIRED)

message(${SODIUM_LIB})
message(${SSL_LIB})
message(${CRYPTO_LIB})

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")

target_link_libraries(
    exec
    ${SODIUM_LIB}
    ${SSL_LIB}
    ${CRYPTO_LIB}
    ${DL_LIB}

no quiero agregar -static a CMAKE_EXE_LINKER_FLAGS, porque en ese caso todo está vinculado estático. CMake encuentra las bibliotecas estáticas:

/usr/local/lib/libsodium.a
/usr/lib/x86_64-linux-gnu/libssl.a
/usr/lib/x86_64-linux-gnu/libcrypto.a

y parece que todo está enlazado estáticamente excepto libcrypto:

readelf -d exec
 0x0000000000000001 (NEEDED)             Shared library: [libcrypto.so.1.0.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [ld-linux-x86-64.so.2]

¿Cómo puedo vincular libcrypto estáticamente a mi ejecutable?

  • ¿Has comprobado que realmente encuentras la biblioteca correcta? También puede ayudar definir opcionalmente la ruta donde se encuentra la biblioteca estática.

    – Ælex

    23/07/2016 a las 19:00

Avatar de usuario de Trevin Corkery
Taponería Trevin

La documentación de CMake a partir de la versión 3.4 en el Buscar página OpenSSL dice:

Establezca OPENSSL_USE_STATIC_LIBS en TRUE para buscar bibliotecas estáticas.

(Suponiendo que si se encuentran se utilizarán)

Ejemplo:

cmake_minimum_required(VERSION 3.4)
project(Foo)

set(SOURCE_FILES main.cpp)

set(OPENSSL_USE_STATIC_LIBS TRUE)
find_package(OpenSSL REQUIRED)

add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} OpenSSL::Crypto)

  • Como dijo @Tsyvarev en los comentarios, OPENSSL_USE_STATIC_LIBS es una pista para encontrar bibliotecas y debe anteponerse find_package(OpenSSL). Verificado en FindOpenSSL.cmake fuente, editado en consecuencia.

    – ceztko

    23 de abril de 2019 a las 9:26

  • “debería anteponer” -> “debería ir antes”. Anteponer es lo opuesto a agregar. En cualquier caso, las cosas no se anteponen a las cosas, y mucho menos a sí mismas. Cosas se anteponen a otras cosas

    – rubenvb

    23 de abril de 2019 a las 9:28

  • @rubenvb Ambos ejemplos en dictionary.cambridge.org/dictionary/english/prepend usar anteponer en la voz activa.

    – Omegastick

    22 de enero de 2020 a las 5:52

  • @Omegastick Sí, voz activa cuando A está anteponiendo B a C, no cuando D “está anteponiendo” sí mismo a E.

    – rubenvb

    22 de enero de 2020 a las 10:17

  • Disputas aparte, “preceder” me parece más claro. “anteponer” casi implica concatenación

    – Thomas Zwaagstra

    21 de julio de 2021 a las 18:03

¿Ha sido útil esta solución?