CMake не может найти библиотеку OpenSSL

#cmake #openssl

#openssl #cmake

Вопрос:

Я пытаюсь установить программное обеспечение, которое использует cmake для установки самого себя. Когда я запускаю cmake .. в командной строке, это выдает мне следующую ошибку в CMakeLists.txt строке, в которой говорится find_package(OpenSSL REQUIRED) :

 -- Could NOT find Git (missing:  GIT_EXECUTABLE) 
ZLib include dirs: /usr/include
ZLib libraries: /usr/lib/arm-linux-gnueabihf/libz.so
Compiling with SSL support
CMake Error at /usr/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (message):
  Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
  system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES
  OPENSSL_INCLUDE_DIR)
Call Stack (most recent call first):
  /usr/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:291 (_FPHSA_FAILURE_MESSAGE)
  /usr/local/share/cmake-2.8/Modules/FindOpenSSL.cmake:313 (find_package_handle_standard_args)
  CMakeLists.txt:436 (find_package)
 

Вот часть файла CMakeLists.txt , из которой исходит ошибка:

 #
# OpenSSL
#
if (WITH_SSL)
    message("Compiling with SSL support")

    if (USE_CYASSL)
        # Use CyaSSL as OpenSSL replacement.
        # TODO: Add a find_package command for this also.
        message("CyaSSL include dir: ${CYASSL_INCLUDE_DIRS}")
        message("CyaSSL libraries: ${CYASSL_LIB}")

        # Additional to the root directory we need to include
        # the cyassl/ subdirectory which contains the OpenSSL
        # compatability layer headers.
        foreach(inc ${CYASSL_INCLUDE_DIRS})
            include_directories(${inc} ${inc}/cyassl)
        endforeach()

        list(APPEND LIB_LIST ${CYASSL_LIB})
    else()
        # TODO: Add support for STATIC also.
        find_package(OpenSSL REQUIRED)

        message("OpenSSL include dir: ${OPENSSL_INCLUDE_DIR}")
        message("OpenSSL libraries: ${OPENSSL_LIBRARIES}")

        include_directories(${OPENSSL_INCLUDE_DIR})
        list(APPEND LIB_LIST ${OPENSSL_LIBRARIES})
    endif()
endif(WITH_SSL)
 

У меня здесь установлен OpenSSL:

 ssl header is here   -- > /usr/local/ssl/include/openssl/
ssl library is here  -- > /usr/local/ssl/lib/libssl.a
                          /usr/local/ssl/lib/libcrypto.a
openssl is here      -- > /usr/local/ssl/bin
 

У меня в моем .profile :

 export LD_LIBRARY_PATH=/usr/local/ssl/include/openssl:/usr/lib:/usr/local/lib:/usr/lib/pkgconfig:/usr/local/include/wx-2.8/wx:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/lib/pkgconfig
export OPENSSL_ROOT_DIR=/usr/local/ssl
export OPENSSL_LIBRARIES=/usr/local/ssl/lib/

PATH = /usr/local/ssl/bin:$PATH
 

Как я могу устранить эту ошибку?

Редактировать:

Теперь я получаю эту ошибку

 /usr/local/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':
dso_dlfcn.c:(.text 0x10): undefined reference to `dlopen'
dso_dlfcn.c:(.text 0x24): undefined reference to `dlsym'
dso_dlfcn.c:(.text 0x30): undefined reference to `dlclose'
 

Ответ №1:

У меня была такая же проблема (openssl), и это сработало для меня в Ubuntu 14.04.1 LTS. Решение остается тем же вплоть до Ubuntu 18.04 (протестировано).

 sudo apt-get install libssl-dev
 

Комментарии:

1. Этот пакет вызывается openssl-devel в Centos 7, поэтому вы должны сделать sudo yum install openssl-devel

Ответ №2:

исправлено в macOS с помощью

 brew install openssl
cmake -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib
 

Комментарии:

1. OPENSSL_LIBRARIES является выходной переменной, а не входной. Смотрите github.com/Kitware/CMake/blob /…

Ответ №3:

Та же проблема и исправлена на моем CentOS 6.5 с помощью следующей команды:

 yum install openssl-devel
 

Ответ №4:

Пожалуйста, установите openssl по ссылке ниже:
https://code.google.com/p/openssl-for-windows/downloads/list
затем задайте переменные ниже:

 OPENSSL_ROOT_DIR=D:/softwares/visualStudio/openssl-0.9.8k_WIN32
OPENSSL_INCLUDE_DIR=D:/softwares/visualStudio/openssl-0.9.8k_WIN32/include
OPENSSL_LIBRARIES=D:/softwares/visualStudio/openssl-0.9.8k_WIN32/lib
 

Комментарии:

1. Работает как шарм, спасибо! Я смог извлечь zip-файл, загруженный по указанной вами ссылке. После этого я просто добавил -DOPENSSL_ROOT-DIR=»C:/Path/To/Extracted/Files «.

2. Теперь это очень устарело и, вероятно, опасно для использования. На веб-сайте openssl есть ссылки на 2 сайта, которые предоставляют двоичные файлы. Похоже, это проблема с библиотеками, связанными с безопасностью, подобными этой. Однако установка подобных значений должна работать и с другими загрузками двоичных файлов.

3. Работал в Windows с -DBUILD_TESTING=OFF -DCMAKE_USE_OPENSSL=ON

4. Установка переменных среды выше позволила Cmake успешно завершиться, но затем я получил ошибки компиляции. Однако я загрузил библиотеки Win64 OpenSSL v1.1.1k по адресу slproweb.com/products/Win32OpenSSL.html которые более актуальны, и тогда это сработало, спасибо!. Я также установил переменную env OPENSSL_CONF для указания на openssl.cfg

Ответ №5:

Если вы можете использовать pkg-config: pkg_search_module() можете найти OpenSSL для вас.

 # Search OpenSSL
find_package(PkgConfig REQUIRED)
pkg_search_module(OPENSSL REQUIRED openssl)

if( OPENSSL_FOUND )
    include_directories(${OPENSSL_INCLUDE_DIRS})
    message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")
else()
    # Error; with REQUIRED, pkg_search_module() will throw an error by it's own
endif()

target_link_libraries(${YOUR_TARGET_HERE} ${OPENSSL_LIBRARIES})
 

Ответ №6:

Если вы используете macOS, выполните следующие действия.

 brew upgrade openssl
brew link --force openssl
pkg-config --modversion openssl
#1.1.1l
 

Очистите папку cmake build и повторно запустите cmake ..

Комментарии:

1. Я столкнулся с этим сегодня, и это решение сработало для меня. Ссылка на конфигурацию: macOS Monterey работает на Apple Silicon.

Ответ №7:

Просто для развлечения я опубликую альтернативный рабочий ответ на вопрос OP:

 cmake -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl/ -DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl/lib/
 

Комментарии:

1. Я думаю, что OPENSSL_CRYPTO_LIBRARY должен указывать на /usr/local/opt/openssl/lib/libcrypto.dylib вместо этого.

Ответ №8:

На всякий случай … это работает для меня. Извините за конкретную версию OpenSSL, но может быть желательно.

 # On macOS, search Homebrew for keg-only versions of OpenSSL
# equivalent of # -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl/ -DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl/lib/
if (CMAKE_HOST_SYSTEM_NAME MATCHES "Darwin")
    execute_process(
        COMMAND brew --prefix OpenSSL 
        RESULT_VARIABLE BREW_OPENSSL
        OUTPUT_VARIABLE BREW_OPENSSL_PREFIX
        OUTPUT_STRIP_TRAILING_WHITESPACE
    )
    if (BREW_OPENSSL EQUAL 0 AND EXISTS "${BREW_OPENSSL_PREFIX}")
        message(STATUS "Found OpenSSL keg installed by Homebrew at ${BREW_OPENSSL_PREFIX}")
        set(OPENSSL_ROOT_DIR "${BREW_OPENSSL_PREFIX}/")
        set(OPENSSL_INCLUDE_DIR "${BREW_OPENSSL_PREFIX}/include")
        set(OPENSSL_LIBRARIES "${BREW_OPENSSL_PREFIX}/lib")
        set(OPENSSL_CRYPTO_LIBRARY "${BREW_OPENSSL_PREFIX}/lib/libcrypto.dylib")
    endif()
endif()

...

find_package(OpenSSL REQUIRED)
if (OPENSSL_FOUND)
  # Add the include directories for compiling
  target_include_directories(${TARGET_SERVER} PUBLIC ${OPENSSL_INCLUDE_DIR})
  # Add the static lib for linking
  target_link_libraries(${TARGET_SERVER} OpenSSL::SSL OpenSSL::Crypto)
  message(STATUS "Found OpenSSL ${OPENSSL_VERSION}")
else()
  message(STATUS "OpenSSL Not Found")
endif()
 

Ответ №9:

Как упоминалось другими, в Ubuntu вы должны запустить

 sudo apt install libssl-dev
 

Но для меня этого было недостаточно, потому что, хотя библиотеки, необходимые для сборки, были установлены, их все равно не удалось найти. Что мне пришлось дополнительно установить, так это

 sudo apt install pkg-config
 

Ответ №10:

у вас есть файл FindOpenSSL.cmake в модуле cmake (путь usr/shared.cmake-3.5/modules) # Поиск OpenSSL

  find_package(OpenSSL REQUIRED) 
if( OpenSSL_FOUND )
    include_directories(${OPENSSL_INCLUDE_DIRS})
    link_directories(${OPENSSL_LIBRARIES})
    message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")

target_link_libraries(project_name /path/of/libssl.so /path/of/libcrypto.so)
 

Комментарии:

1. После замены OPENSSL_INCLUDE_DIRS на OPENSSL_INCLUDE_DIR все работало нормально. win10 vs2019 cmake 3.20.3 slproweb.com (Win32OpenSSL-1_1_1k.exe )

Ответ №11:

Примечание для пользователей Fedora 27: мне пришлось установить openssl-devel пакет для cmake успешного запуска.

sudo dnf install openssl-devel

Ответ №12:

@Morwenn прав. Вам необходимо настроить каталог openssl. Перед этим вам может потребоваться убедиться, что она у вас есть. вы должны проверить, есть ли она у вас. сначала запустите openssl version , затем, если она у вас есть, вы можете win r запустить openssl , и вы найдете каталог ядра, поскольку он может не называться openssl в вашей системе.

введите описание изображения здесь

введите описание изображения здесь

Ответ №13:

Это то, что я добавил в CMakeList.txt (который работал):

 
# https://cmake.org/cmake/help/latest/command/find_package.html
# in the above link, it states:
# "In Module mode, CMake searches for a file called Find<PackageName>.cmake. 
#  The file is first searched in the CMAKE_MODULE_PATH, then among the Find 
#  Modules provided by the CMake installation. If the file is found, it is
#  read and processed by CMake. It is responsible for finding the package,
#  checking the version, and producing any needed messages. Some find-modules
#  provide limited or no support for versioning; check the module documentation."
#
# FindOpenSSL.cmake can be found in path/to/cmake/Modules
#
# https://cmake.org/cmake/help/latest/module/FindOpenSSL.html
#

find_package(OpenSSL REQUIRED)
if (OPENSSL_FOUND)
  # Add the include directories for compiling
  target_include_directories(${PROJECT_NAME} PUBLIC ${OPENSSL_INCLUDE_DIR})

  # Add the static lib for linking
  target_link_libraries(${PROJECT_NAME} OpenSSL::SSL OpenSSL::Crypto)

  message(STATUS "Found OpenSSL ${OPENSSL_VERSION}")

else()

  message(STATUS "OpenSSL Not Found")

endif()
 

Ответ №14:

На WSL я все еще получал ошибку после запуска sudo apt install libssl-dev .

Мне пришлось запустить whereis openssl , а затем обновить закомментированные строки в CMakeCache.txt :

 #OPENSSL_CRYPTO_LIBRARY:FILEPATH=OPENSSL_CRYPTO_LIBRARY-NOTFOUND
OPENSSL_CRYPTO_LIBRARY:FILEPATH=/usr/bin/openssl

#OPENSSL_INCLUDE_DIR:PATH=OPENSSL_INCLUDE_DIR-NOTFOUND
OPENSSL_INCLUDE_DIR:PATH=/usr/include/openssl
 

Ответ №15:

В дополнение к принятому ответу я публикую дополнительную информацию, которая могла бы сэкономить мне два полных дня работы и полный разрыв CMake. На моей машине работает Ubuntu 20.04

Установка libssl-dev, как предложено, включает в себя две библиотеки: libssl и libcrypto. Директива find_package в моем проекте cmake устраняла ошибки ссылок в моем проекте, но по-прежнему не могла найти библиотеки. Это потому, что все принятые ответы говорят вам использовать эти строки:

find_package(ТРЕБУЕТСЯ OpenSSL)

target_link_libraries(MyExecutable OpenSSL Crypto)

Cmake будет искать библиотеки с именами libOpenSSL и libCrypto. Оба не удалось из-за заглавных букв, и libopenssl не существует, потому что файл на самом деле просто называется libssl. Действительно, проверьте содержимое пакета libssl-dev с помощью:

apt-список файлов libssl-dev

Итак, в моем случае решением было использовать вместо этого эту директиву cmake:

target_link_libraries(MyExecutable ssl crypto)

Комментарии:

1. спасибо, еще одна причина ненавидеть ubuntu. Их имена пакетов непоследовательны и тупы, archlinux хорош

Ответ №16:

Ответ на самом деле зависит от состояния вашей системы и программы, в которой вы используете cmake . Исходя из вторых ошибок, которые вы получаете, вам может понадобиться дополнительный openssl пакет, который в данный момент не установлен в вашей системе. Вы можете искать пакеты с помощью aptitude search команды. Я рекомендую искать «ssl», а не «openssl», поскольку пакеты иногда не содержат слова «открыть».

Еще одна вещь, которую вы можете сделать, чтобы проверить, какие пакеты следует устанавливать, — это выяснить, содержит ли руководство или документация устанавливаемого вами продукта информацию о том, какие пакеты следует устанавливать.

Как и в других комментариях к сообщениям, одним из таких пакетов является libssl-dev, но вашей программе могут понадобиться и другие пакеты.