【问题标题】:cmake find openssl libraries in non-standard pathscmake 在非标准路径中查找 openssl 库
【发布时间】:2018-05-25 18:10:44
【问题描述】:

我无法告诉 cmake 在我的 Mac 上找到 openssl。让我说,我是使用 cmake 的业余爱好者,因为我对它的认识是最近的和偶尔的。也就是说,我可以在 cmake 中做一些简单的事情,例如创建小项目并构建它们并运行它们。有些命令(find_library、find_package、...)总是让我感到困惑。

我下载并安装了 openssl(./configure、make 和 make install),它已将文件放入 /opt/openssl

我在谷歌上四处寻找有关在我的程序中简单包含 openssl 的帮助。

一个搜索结果在此处指向一个命令 FindOpenSSL (https://cmake.org/cmake/help/v3.6/module/FindOpenSSL.html)。当我使用 FindOpenSSL 时,cmake 发出错误说 FindOpenSSL 不是命令。

我还尝试了 find_library 和 find_package 命令。 但是如果我检查变量 OPENSSL_FOUND,它仍然是未定义的。

看来我必须对 openssl 的变量进行硬编码(或通过 -D 选项传递给 cmake)。这里的最佳做法是什么? cmake的参考手册似乎是一块拼图,因为我不明白find_library和find_package之间的真正区别,或者什么时候优先使用另一个。

是只有我一个人面临这个问题,还是周围有更多人在困惑和挣扎?

感谢任何人为我指出正确的方向并帮助我摆脱这种困惑。

我当前的 CMakeLists.txt 如下所示:

ravindranaths-MacBook-Pro:crypt_handlers ravindranath$ cat CMakeLists.txt 
cmake_minimum_required (VERSION 3.5.1)

# search for CPP_HOME. If found use this as the install_root dir.
# else, use /usr/local
message (STATUS "Searching for environment var CPP_HOME ...")
if (DEFINED ENV{CPP_HOME})
message (STATUS "Found CPP_HOME: " $ENV{CPP_HOME})
set (CPP_HOME $ENV{CPP_HOME})
else()
message (STATUS "Could not find.  Treating /usr/local as CPP_HOME...")
set (CPP_HOME /usr/local)
endif()
set(Boost_USE_STATIC_LIBS ON)
###########################################################
set(CMAKE_INCLUDE_PATH /usr/local/ssl/include/openssl)

set(OPENSSL_USE_STATIC_LIBS ON)
############################################################
find_package(Boost 1.45.0 COMPONENTS  system ) 
find_package (Threads)

set (CMAKE_CXX_STANDARD 11)
include_directories(../../include)
include_directories(../../include/ext)
include_directories(../../include/ext/spdlog)
include_directories(${CPP_HOME}/externals/plog/include)

add_executable(crypt app.cpp)

link_directories(../../build/src)
target_link_libraries (crypt ${CMAKE_THREAD_LIBS_INIT})

find_library(OpenSSL_LIB  libcrypto.a libssl.a)
#find_package(OpenSSL)

if (OPENSSL_FOUND)
message (STATUS "OPENSSL found")
message (STATUS "OpenSSL INclude directories:" OPENSSL_INCLUDE_DIR)
else() 
message (FATAL_ERROR "OpenSSL Not found.")
endif()

include_directories(${OPENSSL_INCLUDE_DIR})
target_link_libraries(crypt ${CMAKE_DL_LIBS})
TARGET_LINK_LIBRARIES(crypt ${OPENSSL_LIBRARIES} ${LIBYAML_LIBRARIES} pthread -ldl)
#target_link_libraries(crypt /usr/local/ssl/lib/libcrypto.a /usr/local/lib/libssl.a)
target_link_libraries(crypt /usr/local/lib/libcrypto.a /usr/local/lib/libssl.a)

if(Boost_FOUND)
include_directories(${include_directories} ${Boost_INCLUDE_DIRS}) 
target_link_libraries(crypt nettu ${Boost_LIBRARIES})
endif()

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/dist/bin)

更新 现在,我只使用 find_package(OpenSSL),而不是 find_libraries(...)。而且,我正在运行 cmake,如下所示:

cmake -DCMAKE_BUILD_TYPE=Debug -DOPENSSL_ROOT_DIR=/opt/openssl/ -DOPENSSL_LIBRARIES=/opt/openssl/lib/ ..

cmake 通过编写 makefile 成功。但是,运行 make 时出现链接器错误。错误指向缺少 libssl.a,如下所示:

make[2]: *** No rule to make target `/usr/local/lib/libssl.a', needed by `examples/crypt_handlers/crypt'.  Stop.

我不明白的是,make 仍在“/usr/local/lib/..”而不是 /opt/openssl/lib 中寻找 libssl.a。

如何解决这个问题?

【问题讨论】:

    标签: c++ cmake openssl


    【解决方案1】:

    你可以如下改变

    #find_library(OpenSSL_LIB  libcrypto.a libssl.a)
    find_package(OpenSSL)
    

    然后运行

    cmake -DOPENSSL_ROOT_DIR=/opt/openssl

    其中 OPENSSL_ROOT_DIR 是 FindOpenSSL.cmake 标准模块的提示,在哪里可以找到安装 OpenSSL 的根目录。

    【讨论】:

    • 谢谢。我现在可以运行 cmake 了。但是在运行 make 时,我看到它失败并出现 libssl.a 的链接器错误。当我打印变量 ${OPENSSL_LIBRARIES} 时,它只打印 librypto.a,因此它没有在那里设置 libssl.a。我在这里错过了什么吗?
    • 问题已修复。 CMakeLists.txt 在靠近底部的某处有一个额外的行,其中包含 /usr/local/... 的硬编码路径,用于 link_libraries。
    猜你喜欢
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2011-09-05
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    相关资源
    最近更新 更多