我无法告诉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 /.."中寻找libssl.a;而不是/ opt / openssl / lib。
如何解决这个问题?
答案 0 :(得分:2)
您可以更改如下
#find_library(OpenSSL_LIB libcrypto.a libssl.a)
find_package(OpenSSL)
然后运行
cmake -DOPENSSL_ROOT_DIR = / opt / openssl
其中OPENSSL_ROOT_DIR提示FindOpenSSL.cmake标准模块在哪里找到OpenSSL安装的根目录。