多次调用find_package无效

时间:2020-07-19 08:57:02

标签: c++ c cmake openssl

我有一个本地构建的openssl,我将其静态链接到该链接。在我的一个cmake目标中,我正在执行以下操作,并且工作正常。

set(OPENSSL_ROOT_DIR ${PROJECT_SOURCE_DIR}/deps/ssl)
set(OPENSSL_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/deps/ssl/include)
set(OPENSSL_USE_STATIC_LIBS TRUE)
find_package(OpenSSL 1.1.1 EXACT REQUIRED)

我现在有另一个需要openssl的目标,所以我也将相同的代码片段添加到了CMakeLists.txt文件中。在新的cmake配置上(没有CMakeCache.txt),它抱怨第二个目标:

找不到OpenSSL ...等等等等

但是,如果我尝试第二次配置,它会很好。

这是怎么回事?有更好的方法吗?

编辑以添加最少的示例:

CMakeLists.txt(根)

cmake_minimum_required (VERSION 3.16)

project (test)

add_subdirectory(test1)
add_subdirectory(test2)

test1和test2下的CMakeLists.txt(相同)

set(OPENSSL_ROOT_DIR ${PROJECT_SOURCE_DIR}/../deps/ssl)
set(OPENSSL_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/../deps/ssl/include)
set(OPENSSL_USE_STATIC_LIBS TRUE)
find_package(OpenSSL 1.1.1 EXACT REQUIRED)

结果是

-- Found OpenSSL: /var/dev/deps/ssl/lib/libcrypto.a (found suitable exact version "1.1.1g")  
CMake Error at /usr/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:164 (message):
  Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
  system variable OPENSSL_ROOT_DIR (missing: OPENSSL_INCLUDE_DIR) (Required
  is exact version "1.1.1")
Call Stack (most recent call first):
  /usr/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:445 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake-3.17/Modules/FindOpenSSL.cmake:459 (find_package_handle_standard_args)
  test2/CMakeLists.txt:4 (find_package)

您可以看到找到了第一个,因此路径正确。

1 个答案:

答案 0 :(得分:0)

find_package本身会填充OPENSSL_INCLUDE_DIROPENSSL_DIR等变量(缓存条目),因此我认为不需要

set(OPENSSL_ROOT_DIR ${PROJECT_SOURCE_DIR}/deps/ssl)
set(OPENSSL_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/deps/ssl/include)

如果您打算建议一些路径/提示(在本例中为${PROJECT_SOURCE_DIR}/deps/ssl),则建议在PATHS中使用HINTSfind_package参数。例如:

find_package(OpenSSL 1.1.1 EXACT REQUIRED
             HINTS ${PROJECT_SOURCE_DIR}/deps/ssl 
                   ${PROJECT_SOURCE_DIR}/deps/ssl/include
)

如果find_package成功(其结果存储在OpenSSL_FOUND中),则可以将库链接为目标:

if (NOT OpenSSL_FOUND)
    message(FATAL_ERROR "ERROR: OpenSSL package not found.")
endif()

target_link_libraries(${YOUR_TARGET_HERE} ${OpenSSL_LIBRARIES})
target_include_directories(${YOUR_TARGET_HERE} PUBLIC ${OpenSSL_INCLUDE_DIRS})

您只需要将find_package命令放入“ root” CMakeLists.txt中,而只需在子CMakeList.txt中使用缓存变量(如OpenSSL_LIBRARIESOpenSSL_INCLUDE_DIRS)即可。您要将它们链接到目标的文件。

希望这可以解决您的问题:)