CMake không thể tìm thấy thư viện OpenSSL


118

Tôi đang cố gắng cài đặt một phần mềm sử dụng cmake để tự cài đặt, khi tôi cung cấp tại commandlin cmake ..
nó cho tôi lỗi sau trong tệp này, CMakeLists.txt -------- dòng ---> find_package ( OpenSSL BẮT BUỘC): -

 cmake ..
-- 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)

Đây là một phần của tệp CMakeLists.txt, nơi đang xảy ra lỗi: ------

#
# 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)

http://www.opensource.apple.com/source/OpenSSL/OpenSSL-7.1/openssl/INSTALL?txt
Bây giờ tôi đã cài đặt Openssl, tại đây: ----

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

Tôi đã đặt .profile của mình là: ----

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

Làm thế nào để giải quyết lỗi này?

sửa: -
Gặp lỗi này

/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'

Câu trả lời:


303

Tôi đã gặp vấn đề tương tự (openssl) và điều này đã hoạt động với tôi trên Ubuntu 14.04.1 LTS. Giải pháp tương tự cho đến Ubuntu 18.04 (đã thử nghiệm).

sudo apt-get install libssl-dev

20
Câu trả lời này nên được chấp nhận! Cảm ơn vì giải pháp!
Mirakurun

1
Hoạt động trên Ubuntu 16.04 LTS.
Falko

9
Gói này được gọi openssl-develtrên Centos 7, vì vậy bạn sẽ làm như vậysudo yum install openssl-devel
user2888798

2
Điều này không hoạt động nữa; ít nhất không phải trên Ubuntu 18.04.
Astrid

5
@Astrid Tôi đã có thể làm cho nó hoạt động trên Ubuntu 18.04
Châu Giang

41

Nếu bạn đang sử dụng Ubuntu, hãy chạy sudo apt install libssl-dev.


4
@Astrid nó hoạt động tốt đối với tôi. thông báo lỗi gì bạn nhận được?
Bruno Alexandre Rosa

Cũng làm việc cho tôi trên ubuntu 18.04 @Astrid
Shehan

29

đã sửa nó trên macOS bằng cách sử dụng

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

1
OPENSSL_LIBRARIESlà một biến đầu ra, không phải là đầu vào. Xem github.com/Kitware/CMake/blob/…
Simon Warta

21

Vui lòng cài đặt openssl từ liên kết dưới đây:
https://code.google.com/p/openssl-for-windows/downloads/list
sau đó đặt các biến bên dưới:

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

Hoạt động như một sự quyến rũ, cảm ơn! Tôi đã có thể giải nén tệp zip được tải xuống từ liên kết mà bạn đã đề cập. Sau đó, tôi chỉ cần thêm -DOPENSSL_ROOT-DIR = "C: / Path / To / Extracted / Files".
Charlie Vieillard

5
Điều này hiện đã rất lỗi thời và có thể nguy hiểm khi sử dụng. Trang web openssl có liên kết đến 2 trang cung cấp mã nhị phân. Đó dường như là vấn đề với các lib liên quan đến bảo mật như thế này. Tuy nhiên, việc đặt các giá trị như vậy cũng sẽ hoạt động với các bản tải xuống nhị phân khác.
mắc cạn

Làm việc trên Windows với-DBUILD_TESTING=OFF -DCMAKE_USE_OPENSSL=ON
Florida

16

Cùng một vấn đề và đã khắc phục nó trên centos 6.5 của tôi bằng lệnh sau.

yum install openssl-devel

11

sudo apt install libssl-dev hoạt động trên ubuntu 18.04.


2
Bạn có thể cung cấp thêm thông tin chi tiết về giải pháp bạn đã tìm thấy
XavM

9

Nếu bạn có thể sử dụng pkg-config : pkg_search_module()có thể tìm OpenSSL cho bạn.

# 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})

4

bạn đang có tệp FindOpenSSL.cmake trong mô-đun cmake (đường dẫn usr / shared.cmake-3.5 / modules) # Tìm kiếm 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)

4

Lưu ý cho người dùng Fedora 27: Tôi phải cài đặt openssl-develgói để chạy cmakethành công.

sudo dnf install openssl-devel


4

Chỉ cho vui, tôi xin đăng một câu trả lời làm việc thay thế cho câu hỏi của OP:

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

1

@Morwenn nói đúng. Bạn cần phải cấu hình DIR openssl. Trước đó, bạn có thể cần phải chắc chắn rằng bạn có nó. bạn nên kiểm tra xem bạn có nó không. lần đầu tiên chạy openssl version, sau đó nếu bạn có nó, bạn có thể win + rchạy openssl và bạn giành chiến thắng, hãy tìm dir cốt lõi vì nó có thể không có tên là openssl trong hệ thống của bạn.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


-1

Đây là những gì tôi đã thêm trong CMakeList.txt(đã hoạt động):


# 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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.