c++ - 在 CMake 中静态链接 OpenSSL 加密库

标签 c++ c gcc 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 文档说:

Set OPENSSL_USE_STATIC_LIBS to TRUE to look for static libraries.

(假设如果找到它们将被使用)

例子:

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)

关于c++ - 在 CMake 中静态链接 OpenSSL 加密库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35477940/

相关文章:

c - 为什么 `\`影响printf的返回值?

c++ - 如何编写类型特征来检查类型是否可以通过非缩小转换转换为另一种类型?

C++ 编译器输出

c++ - 将 "vector of vector"复制到“array of array”

c++ - cocos2d-x 中的碰撞检测

c++ - STL中有 "magic"吗?

c++ - 在 C++ 类型转换期间自动舍入 a

c++ - 为什么地址被认为是指针?

c - fwrite() 替代 32 位系统上的大文件

gcc -Wall 但抑制 -Wunknown-pragmas