Statisches Verknüpfen der OpenSSL-Kryptobibliothek in CMake

Lesezeit: 2 Minuten

Roberts Benutzeravatar
Robert

Ich möchte die unten aufgeführten Bibliotheken statisch verknüpfen:

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}

Ich möchte nichts hinzufügen -static Zu CMAKE_EXE_LINKER_FLAGS, denn in diesem Fall ist alles statisch verknüpft. CMake findet die statischen Bibliotheken:

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

und es scheint, dass alles statisch verknüpft ist, außer 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]

Wie kann ich verlinken libcrypto statisch zu meiner ausführbaren Datei?

  • Haben Sie überprüft, ob Sie tatsächlich die richtige Bibliothek gefunden haben? Außerdem kann es hilfreich sein, optional den Pfad zu definieren, in dem die statische Bibliothek gefunden werden soll.

    – Ælex

    23. Juli 2016 um 19:00 Uhr

Trevin Corkerys Benutzeravatar
Trevin Corkery

Die CMake-Dokumentation ab Version 3.4 auf der FindOpenSSL-Seite sagt:

Setzen Sie OPENSSL_USE_STATIC_LIBS auf TRUE, um nach statischen Bibliotheken zu suchen.

(Vorausgesetzt, wenn sie gefunden werden, werden sie verwendet)

Beispiel:

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)

  • Wie von @Tsyvarev in den Kommentaren angegeben, OPENSSL_USE_STATIC_LIBS ist ein Hinweis zum Auffinden von Bibliotheken und sollte vorangestellt werden find_package(OpenSSL). Verifiziert in FindOpenSSL.cmake Quelle, entsprechend bearbeitet.

    – ceztko

    23. April 2019 um 9:26 Uhr

  • „sollte vorangestellt werden“ -> „sollte vorher kommen“. Prepend ist das Gegenteil von append. Auf jeden Fall stellen Dinge keine Dinge voran, geschweige denn sich selbst. Dinge werden vorangestellt zu anderen Dingen.

    – rubenvb

    23. April 2019 um 9:28

  • @rubenvb Beide Beispiele weiter dictionary.cambridge.org/dictionary/english/prepend verwenden voranstellen im Aktiv.

    – Omegastick

    22. Januar 2020 um 5:52

  • @Omegastick Ja, aktive Stimme, wenn A B vor C voranstellt, nicht, wenn D „vorangestellt“ ist selbst zu E.

    – rubenvb

    22. Januar 2020 um 10:17 Uhr

  • Abgesehen vom Gezänk erscheint mir „vorangehen“ klarer. „voranstellen“ impliziert fast eine Verkettung

    – Thomas Zwaagstra

    21. Juli 2021 um 18:03 Uhr

1451360cookie-checkStatisches Verknüpfen der OpenSSL-Kryptobibliothek in CMake

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy