Статическое связывание OpenSSL Crypto в CMake - PullRequest
0 голосов
/ 14 марта 2019

Мне нужно сделать кросс-скомпилированный OpenSSL для устройства MIPS. Я пытался следовать документации. Установите 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]

Я не понимаю, что я делаю неправильно.

РЕДАКТИРОВАТЬ: Уже посмотрел на Статическое связывание криптографической библиотеки OpenSSL в 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})

1 Ответ

1 голос
/ 14 марта 2019

Значение 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 в директории сборки) перед новой попыткой.В противном случае будут использованы уже найденные (общие!) Библиотеки и повторный поиск не будет выполнен.

...