Cmake在非标准路径中找到OpenSSL库



我很难告诉cmake在我的Mac上找到OpenSSL。让我说,我是我对使用Cmake的业余爱好者,这是我的熟人,是最近的偶尔。也就是说,我可以在CMAKE中做简单的事情,例如创建小型项目并运行它们。某些命令(find_library,find_package,...)总是困惑我。

我下载并安装了openssl(./configure,Make install),并且将文件放入/opt/openssl

我在搜索搜索以查看帮助中的简单包含在我的程序中。

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

我还尝试了find_library和find_package命令。但是,如果我检查变量openssl_found,它仍然不确定。

看来我必须要进行硬码(或通过-D选项才能cmake)openssl的变量。这里最好的做法是什么?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通过编写makefiles成功。但是,运行时会遇到链接器错误。错误指向丢失libssl.a如下:

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

我不明白的是,该品牌仍在寻找"/usr/local/lib/.."中的libssl.a,而不是/opt/openssl/lib。

如何解决此问题?

您可以按以下方式更改

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

和运行

cmake -dopenssl_root_dir =/opt/openssl

openssl_root_dir是findopenssl.cmake标准模块的提示。

最新更新