【问题标题】:Static linking of OpenSSL Crypto in CMakeCMake 中 OpenSSL Crypto 的静态链接
【发布时间】:2019-03-14 14:32:55
【问题描述】:

我需要为 MIPS 设备制作一个交叉编译的 OpenSSL。我已经尝试按照文档进行操作。将OPENSSL_USE_STATIC_LIBS 设置为true,并将target_link_libraries 设置为您需要的库文件。

CMakeLists.txt:

compileAsC99()

if(NOT ${use_http})
    message(FATAL_ERROR "program being generated without HTTP support")
endif()

set(program_c_files
    ...
)

set(program_h_files
    ...
)

include_directories(...)

add_executable(program ${program_c_files} ${program_h_files})

set(OPENSSL_USE_STATIC_LIBS TRUE)
#target_link_libraries(program OpenSSL::Crypto)
target_link_libraries(program /home/program/mips/lib/libssl.so.1.1)
target_link_libraries(program /home/program/mips/lib/libcrypto.so.1.1)

它编译良好,没有警告,但检查生成的二进制文件告诉我它仍然是共享库。

readelf -d 程序:

Dynamic section at offset 0x1bc contains 35 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libssl.so.1.1]
 0x00000001 (NEEDED)                     Shared library: [libcrypto.so.1.1]
 0x0000000f (RPATH)                      Library rpath: [/home/program/mips/lib]

我不明白我做错了什么。

编辑:已经看过Linking statically OpenSSL crypto library in CMake,但它并没有告诉我任何新的东西。

编辑 2:根据回复更新了 CMakeLists.txt 文件: CMakeLists.txt:

compileAsC99()

if(NOT ${use_http})
    message(FATAL_ERROR "program being generated without HTTP support")
endif()

set(program_c_files
    ...
)

set(program_h_files
    ...
)

include_directories(...)

add_executable(program ${program_c_files} ${program_h_files})

find_package(OpenSSL REQUIRED)
if(OPENSSL_FOUND)
set(OPENSSL_USE_STATIC_LIBS TRUE)
message("OPENSSL FOUND!")
endif()
target_link_libraries(program OpenSSL::Crypto)

输出:

-- IoT Client SDK Version = 1.2.11
-- Provisioning client OFF
-- target architecture: GENERIC
-- Cross compiling not using pkg-config
-- Found CURL: /home/program/mips/lib/libcurl.a (found version "7.63.0")
-- Found CURL: /home/program/mips/lib/libcurl.a
-- target architecture: GENERIC
-- target architecture: GENERIC
-- target architecture: GENERIC
-- target architecture: GENERIC
-- iothub architecture: GENERIC
OPENSSL FOUND!
-- Configuring done
-- Generating done

编辑繁荣: 如果你,未来的人,遇到undefined reference to dlopen,我将以下内容添加到我的CMakeLists.txt 文件中

target_link_libraries(program ${CMAKE_DL_LIBS})

【问题讨论】:

    标签: cmake openssl static-linking


    【解决方案1】:

    设置为 TRUE,变量 OPENSSL_USE_STATIC_LIBS 强制 find_package(OpenSSL) 搜索静态库。所以这个变量只适用于那个调用,如果你使用它的结果:

    set(OPENSSL_USE_STATIC_LIBS TRUE)
    find_package(OpenSSL REQUIRED)
    target_link_libraries(program OpenSSL::Crypto)
    

    如果您已经执行了cmake 而没有设置OPENSSL_USE_STATIC_LIBS,那么您需要在重新尝试之前删除CMake 缓存(构建目录下的CMakeCache.txt)。否则,将使用已找到(共享!)的库,并且不会执行重新搜索。

    【讨论】:

    • 还是不行。根据构建日志,似乎找到了正确的sslcrypto 库文件,但readelf 仍然报告这些是共享的。尝试完全删除“cmake”文件夹并在没有任何更改的情况下重建所有内容。是否有另一个标志需要在某个地方设置?
    • “似乎根据构建日志找到了正确的sslcrypto 库文件” - 请显示该部分日志,在那里可以找到库是静态的还是共享的。另外,正如您在代码target_link_libraries(program OpenSSL::Crypto) 中所做的那样,您不使用target_link_libraries(program /home/program/mips/lib/libssl.so.1.1),对吗?
    • 用输出更新了我的帖子并修改了CMakeLists.txt
    • 输出包含libcurl 的静态库,但您的问题在于libssllibcrypto。请注意,在您更新的代码中,您在相关问题上使用that answer,而不是我的。我已经为这个答案添加了 cmets 为什么它是可疑的。
    • 链接始终使用target_link_libraries 执行。但是对于 搜索 库(而不是硬编码它们的路径),您可以使用任何可用的方式。如果库支持find_package(XXX),则使用该命令。如果可以使用pkg-config 命令行实用程序找到该库,则使用pkg_check_modules。如果库不支持搜索它的机制,则求助于find_library
    猜你喜欢
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    相关资源
    最近更新 更多