Linking statically OpenSSL crypto library in CMake
20,723
The CMake documentation starting with version 3.4 on the FindOpenSSL page says:
Set OPENSSL_USE_STATIC_LIBS to TRUE to look for static libraries.
(Assuming if they are found they will be used)
Example:
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)
Author by
robert
Updated on July 09, 2022Comments
-
robert almost 2 years
I want to statically link the libraries listed below:
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}
I do not want to add
-static
toCMAKE_EXE_LINKER_FLAGS
, because in that case everything is linked static. CMake finds the static libraries:/usr/local/lib/libsodium.a /usr/lib/x86_64-linux-gnu/libssl.a /usr/lib/x86_64-linux-gnu/libcrypto.a
and it seems that everything is linked statically except
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]
How can I link
libcrypto
statically to my executable? -
ceztko about 5 yearsAs stated by @Tsyvarev in the comments,
OPENSSL_USE_STATIC_LIBS
is an hint in finding libraries and should prependfind_package(OpenSSL)
. Verified inFindOpenSSL.cmake
source, edited accordingly. -
rubenvb about 5 years"should prepend" -> "should come before". Prepend is the opposite of append. In any case, things don't prepend things, let alone themselved. Things are prepended to other things.
-
Omegastick over 4 years@rubenvb Both of the examples on dictionary.cambridge.org/dictionary/english/prepend use prepend in the active voice.
-
rubenvb over 4 years@Omegastick Yes, active voice when A is prepending B to C, not when D "is prepending" itself to E.
-
Thomas Zwaagstra almost 3 yearsbickering aside, "precede" seems more clear to me. "prepend" almost implies concatenation