Невозможно статически связать libcrypto с cmake

Я создаю приложение, в котором OpenSSL libcrypto является зависимостью. До сих пор я связывался с ним динамически, но хотел переключиться на статическую связь.

Выполнив поиск в Интернете, я обнаружил, что вам нужно установить флаг OPENSSL_USE_STATIC_LIBS на TRUE, сбросить кеш сборки, и он должен найти статическую версию OpenSSL и связать ее с ней (если она найдена). Я вижу, что CMake действительно находит libcrypto.lib, но исполняемый файл все еще связывается с DLL.

Вот журнал CMake:

-- The C compiler identification is MSVC 19.38.33133.0
-- The CXX compiler identification is MSVC 19.38.33133.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.38.33130/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - not found
-- Found Threads: TRUE 
-- Found OpenSSL: C:/Program Files/OpenSSL/lib/libcrypto.lib (found version "3.0.10")  # <== correctly found libcrypto.lib
-- Configuring done (5.3s)
-- Generating done (0.0s)

и CMakeLists.txt

cmake_minimum_required(VERSION 3.23)
project(common)

set(CMAKE_CXX_STANDARD 20)

set(OPENSSL_USE_STATIC_LIBS TRUE)    # <== set correctly before find_package
find_package(OpenSSL REQUIRED)

add_library(common STATIC
        common.cpp)
target_include_directories(common PUBLIC include)
target_link_libraries(common OpenSSL::Crypto)

Я не понимаю, что я делаю неправильно, я проверил несколько сообщений здесь, и ответы, кажется, делают именно то, что я написал в CMakeLists (я видел Статическое связывание криптобиблиотеки OpenSSL в CMake и Статическое связывание OpenSSL Crypto в CMake).

Среда

  • cmake: cmake версии 3.28.1 (CMake; пакет IDE JetBrains; сборка 16);
  • cl.exe: Microsoft (R) C/C++ оптимизирующий компилятор версии 19.38.33133 для x86;
  • LINK.exe: Microsoft (R) инкрементный компоновщик версии 14.38.33133.0;
  • ninja: 1.12.0;
  • OpenSSL: OpenSSL 3.0.10, 1 августа 2023 г. (Библиотека: OpenSSL 3.0.10, 1 августа 2023 г.).

Вы уверены, что libcrypto.lib — статическая библиотека? Помните, что библиотеки импорта также имеют расширение .lib и во время выполнения им требуется dll.

drescherjm 20.08.2024 21:31

исполняемый файл по-прежнему связан с DLL. msvc не связывается с DLL для собственного кода, он использует библиотеки импорта, которые имеют расширение .lib, но не содержат реализации и требуют DLL во время выполнения.

drescherjm 20.08.2024 21:34

где вы взяли двоичные файлы openssl?

Alan Birtles 20.08.2024 21:54

см. github.com/Kitware/CMake/blob/… для получения подробной информации о том, как cmake выполняет поиск. Если он не находит статические библиотеки, вместо этого он просто использует общие.

Alan Birtles 20.08.2024 22:05

@drescherjm возможно ты прав, lib /list libcrypto.lib только показывает libcrypto-3-x64.dll. можете ли вы опубликовать ответ, чтобы я мог его принять?

dodicidodici 21.08.2024 00:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключается в том, что ваша библиотека libcrypto.lib на самом деле не является статической библиотекой, а является библиотекой импорта.

В документации msdn библиотека импорта описывается следующим образом:

Файл библиотеки импорта (.lib) содержит информацию, которую компоновщик необходимо для разрешения внешних ссылок на экспортированную DLL функции, чтобы система могла найти указанную DLL и экспортированные функции DLL во время выполнения. Вы можете создать библиотеку импорта для вашей DLL, когда вы создаете свою DLL.

Когда вы ссылаетесь на библиотеку импорта, ваша программа потребует загрузки зависимой dll при загрузке вашего приложения.

Кроме того, как прокомментировал @Alan Birtles в вопросе, модуль поиска CMake для OpenSSL найдет библиотеку импорта, если статическая библиотека недоступна:
https://github.com/Kitware/CMake/blob/041a482079baf690f1bf8e9cdc8a7a1922016267/Modules/FindOpenSSL.cmake#L360

Другие вопросы по теме

Я пытался создать общие библиотеки C++ для Python, используя cmake и pybind11, но получаю ошибки, которые не знаю, как исправить
G++.exe: ошибка: /utf-8: входной файл компоновщика не найден: такого файла или каталога нет
ССЫЛКА: фатальная ошибка LNK1104: невозможно открыть файл libboost_log-vc143-mt-gd-x64-1_85.lib в проекте CMake
Как я могу связать статическую библиотеку, которая зависит от других библиотек в cmake?
Как использовать несколько GTests в CMake
Как я могу использовать VSCode с CMake и иметь разные цели, каждая из которых имеет разную архитектуру и набор инструментов?
Использование std::mutex без его включения
Как установить экспат и связать его с моим проектом C++ в GitHub Windows Runner
Как использовать MariaDB с POCO (https://pocoproject.org/), используя C++ в Windows. Например, как мне связать библиотеки MariaDB и т. д. в CMake
Как заставить CMake находить системные библиотеки по умолчанию для связывания без ручных манипуляций со сценариями?