在CMake中静态链接OpenSSL加密库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在CMake中静态链接OpenSSL加密库相关的知识,希望对你有一定的参考价值。

我想静态链接下面列出的库:

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}

我不想将-static添加到CMAKE_EXE_LINKER_FLAGS,因为在这种情况下,所有内容都是静态的。 CMake找到静态库:

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

除了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]

如何将libcrypto静态链接到我的可执行文件?

答案

FindOpenSSL page版本3.4开始的CMake文档说:

将OPENSSL_USE_STATIC_LIBS设置为TRUE以查找静态库。

(假设他们被发现将被使用)

例:

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)

以上是关于在CMake中静态链接OpenSSL加密库的主要内容,如果未能解决你的问题,请参考以下文章

CMake 使用其他静态库构建静态库

如何使用cmake生成基于静态库的动态链接库

使用 c++/cmake 链接静态库

Cmake动态编译VTK库(QVtkwidget)

cmake 强制链接静态库

cmake设置默认静态链接库