【问题标题】:Android CMake: Could NOT find OpenSSLAndroid CMake:找不到 OpenSSL
【发布时间】:2017-08-30 10:38:33
【问题描述】:

我对使用 NDK/CMake 的 Android 还是很陌生。但是,我正在尝试将本机 CMake 库嵌入到 Android 应用程序中。但是,这个库依赖于 OpenSSL。

这就是我下载 OpenSSL for Android 预编译版本的原因。

但是,当我尝试同步项目时,出现以下错误:

 Could NOT find OpenSSL, try to set the path to OpenSSL root folder
 in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES)  
 (found version "1.1.0f")

这是我的(最小)项目结构

<app-name>
   -app
      - src
        - main
          - cpp
            - library
              - CMakeLists.txt
            CMakeLists.txt
   - distribution
     - openssl
       - armeabi
         - include
           - openssl
               ... 
         - lib
            libcrypto.a, libssl.a

在我的 build.gradle 中,我定义了以下内容:

externalNativeBuild {
    cmake {
        path 'src/main/cpp/CMakeLists.txt'
    }
}

/app/src/main/cpp/CmakeLists.txt 如下:

cmake_minimum_required(VERSION 3.4.1)


set(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../distribution)

set(OPENSSL_ROOT_DIR ${distribution_DIR}/openssl/${ANDROID_ABI})
set(OPENSSL_LIBRARIES "${OPENSSL_ROOT_DIR}/lib")
set(OPENSSL_INCLUDE_DIR ${OPENSSL_ROOT_DIR}/include)


message("OPENSSL_LIBRARIES ${OPENSSL_LIBRARIES}")
message("OPENSSL_INCLUDE_DIR ${OPENSSL_INCLUDE_DIR}")

find_package(OpenSSL REQUIRED)


add_subdirectory(library)

【问题讨论】:

  • 使用这个:link 它会帮助你...

标签: android c++ cmake android-ndk


【解决方案1】:

find_package(...) 在几个标准位置搜索库(阅读here - 搜索“在 cmake 中指定的搜索路径”)。在您的情况下,它失败了,因为它在您尝试交叉编译 Android 代码的机器上找不到 OpenSSL。

我知道我在将 OpenSSL 与我的原生 c++ Android 代码链接方面也进行了各种尝试,我管理它的唯一方法是:

SET(distribution_DIR ${CMAKE_SOURCE_DIR}/../../../../distribution)
SET(OPENSSL_ROOT_DIR ${distribution_DIR}/openssl/${ANDROID_ABI})

SET(OPENSSL_LIBRARIES_DIR "${OPENSSL_ROOT_DIR}/lib")
SET(OPENSSL_INCLUDE_DIR ${OPENSSL_ROOT_DIR}/include)
SET(OPENSSL_LIBRARIES "ssl" "crypto")


#<----Other cmake code/defines here--->

LINK_DIRECTORIES(${OPENSSL_LIBRARIES_DIR})   

ADD_LIBRARY(library #your other params here#)   

TARGET_INCLUDE_DIRECTORIES(library PUBLIC ${OPENSSL_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(library ${OPENSSL_LIBRARIES})

我知道我还尝试通过使用一些配置属性(例如CMAKE_FIND_ROOT_PATH)和其他一些方法来使 find_package 正常工作,但我无法完成。

不知道我提供的解决方案是否是最好的方法,cmake-wise。也许有人有更好的方法,但可惜,它解决了我当时的问题。

希望对你有帮助

【讨论】:

  • 谢谢,我试过你的方法。不幸的是,我收到了同样的错误信息。我只把ADD_LIBRARY改成了add_subdirectory(library) add_library(library ${library_srcs})
  • 啊,我明白了。您是在暗示 find_package(...) 根本不起作用。在那种情况下,我必须编辑 library/CMakeLists.txt 并删除 find_package 对吗?
  • 好吧,使用我建议您不需要 find_package 的方法,而不是 OpenSSL,因为您手动向 OpenSSL 提供数学。如果您需要其他东西,例如 OpenGL,您可以使用 find_package
  • 我还认为“库”是需要 OpenSSL 的项目。如果不是这种情况,那么您可以使用add_subdirectory(library) add_library(library ${library_srcs}) LINK_DIRECTORIES(${OPENSSL_LIBRARIES_DIR}) ADD_LIBRARY(myCppNativeCore #your other params here#) TARGET_INCLUDE_DIRECTORIES(myCppNativeCore PUBLIC ${OPENSSL_INCLUDE_DIR}) TARGET_LINK_LIBRARIES(myCppNativeCore library ${OPENSSL_LIBRARIES}) 将您的library 和OpenSSL 依赖项添加到您的myCppNativeCore 库中,该库可能位于/app/src/main/cpp
  • 嗨@cjurjiu 我知道这是一个旧线程,但我发布了一个正确依赖find_package(OpenSSL) 机制的解决方案,以防您感兴趣。
【解决方案2】:

未找到 OpenSSL 的原因是因为所有 find_*() 命令还依赖于变量 CMAKE_SYSROOT 变量,该变量用于为这些命令搜索的路径添加前缀。交叉编译时使用这个指向目标环境的根目录。

解决办法是将OpenSSL所在的路径添加到CMAKE_FIND_ROOT_PATHfind_library() 的文档指出:

CMake 变量 CMAKE_FIND_ROOT_PATH 指定一个或多个 附加到所有其他搜索目录的目录。这 有效地“重新定位”给定位置下的整个搜索。

这个解决方案对我有用:

set(OPENSSL_ROOT_DIR "/path/to/openssl/for/android")
list(APPEND CMAKE_FIND_ROOT_PATH "${OPENSSL_ROOT_DIR}")
find_package(OpenSSL)

【讨论】:

    猜你喜欢
    • 2013-04-21
    • 1970-01-01
    • 2018-10-23
    • 2020-10-17
    • 2017-09-25
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多