我有一个本地构建的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)
您可以看到找到了第一个,因此路径正确。
答案 0 :(得分:0)
find_package
本身会填充OPENSSL_INCLUDE_DIR
和OPENSSL_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
中使用HINTS
或find_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_LIBRARIES
和OpenSSL_INCLUDE_DIRS
)即可。您要将它们链接到目标的文件。
希望这可以解决您的问题:)