Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake设置查找包的开始路径?_C++_Cmake - Fatal编程技术网

C++ CMake设置查找包的开始路径?

C++ CMake设置查找包的开始路径?,c++,cmake,C++,Cmake,我正在使用一个更新版本的openssl,我是通过自制程序安装在Mac上的,我想知道是否有办法为CMAKE的FIND_包函数设置一个启动路径?现在,当我尝试使用FIND_包时,CMAKE将查找我的操作系统使用的openssl的旧版本。我目前正在我的CMakeLists.txt中使用此文件 SET(OPENSSL_LIB_DIR /usr/local/Cellar/openssl/1.0.2f/lib) INCLUDE_DIRECTORIES(/usr/local/Cellar/openssl/1.

我正在使用一个更新版本的openssl,我是通过自制程序安装在Mac上的,我想知道是否有办法为CMAKE的FIND_包函数设置一个启动路径?现在,当我尝试使用FIND_包时,CMAKE将查找我的操作系统使用的openssl的旧版本。我目前正在我的CMakeLists.txt中使用此文件

SET(OPENSSL_LIB_DIR /usr/local/Cellar/openssl/1.0.2f/lib)
INCLUDE_DIRECTORIES(/usr/local/Cellar/openssl/1.0.2f/include)
TARGET_LINK_LIBRARIES(mangaMe ${OPENSSL_LIB_DIR}/libcrypto.dylib ${OPENSSL_LIB_DIR}/libssl.dylib)

我唯一的问题是,如果我的openssl更新,我必须手动更新路径中的版本。我已经阅读了CMAKE FIND_软件包文档,但不确定我将使用哪些路径变量来获得我想要的效果。

在调用FindOpenSSL之前,您可以使用
OPENSSL_ROOT_DIR

set(OPENSSL_ROOT_DIR /usr/local/Cellar/openssl/1.0.2f/)
include(FindOpenSSL)

Cmake附带FindOpenSSL.Cmake模块,该模块在搜索OPENSSL库时使用OPENSSL_ROOT_DIR变量。 最好使用该接口,因为它可以处理版本(主版本、次版本、补丁)和其他相关的libs阴影等

您可以在调用cmake时通过命令行使用它,或者在源代码中设置它,就像其他人指出的那样

cmake-DOPENSSL_ROOT_DIR=/path/to/openssl

通常,如果您试图查找未提供默认cmake模块的其他库,则可以使用

提示、路径、路径后缀和其他变量,如NO_DEFAULT_PATH(和其他NO_*)告诉cmake不要查看标准路径

PATH = path to the location of library
#this makes sense when PATH is pointed to the 'root' of the package location
# for examle,path=/usr path_suffix=lib64 lib32 lib
PATH_SUFFIXES = lib lib64 lib32  
NO_DEFAULT_PATH # Only look in above PATHs and nowhere else.

您可以将
OPENSSL\u ROOT\u DIR
cmake变量或
OPENSSL\u ROOT\u DIR
env变量设置为以下路径:
/usr/local/ceral/OPENSSL/*
,然后使用
find\u package
。例如:

set(OPENSSL_ROOT_DIR /usr/local/Cellar/openssl/*)
find_package(OpenSSL REQUIRED)
include_directories(${OPENSSL_INCLUDE_DIR})
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${OPENSSL_LIBRARIES})

这仍然需要我指定openssl的确切版本,这正是我试图避免的。伙计,我需要的是
include(FindOpenSSL)
。为什么这不仅仅是find_软件包的一部分?克玛克。。。如此接近。。。然而到目前为止…可以找到我需要链接的库,但由于某些原因,它无法找到我需要的包含文件。获取此错误/usr/local/include/boost/asio/ssl/detail/openssl\u types.hpp:19:10:致命错误:“未找到openssl/conf.h”文件{include^1生成错误。@Jem4687,显示以下命令的输出:
消息(“openssl\u include\u DIR:${openssl\u include\u DIR})
另一个快速问题。当包含Boost和我正在使用的另一个软件包的目录时,我可以使用名称Boost_INCLUDE_DIRS或Boost_INCLUDE_DIR,但对于OpenSSL,我必须使用OpenSSL_INCLUDE_DIR?@Jem4687,查找您在哪里安装了cmake并在那里搜索模块子文件夹。除了许多其他文件外,您还可以在那里找到
FindOpenSSL.cmake
FindBoost.cmake
文件。您可以查看内部,找出这个或那个用于包查找的模块有哪些输入和输出变量。@Jem4687,或者您可以搜索
FindXXX.cmake
,如果cmake有文档,它将指向文档,或者作为奖励,它将为包找到cmake没有模块的cmake文件。