Android CMake:找不到OpenSSL

时间:2017-08-30 10:38:33

标签: android c++ cmake android-ndk

我对使用NDK / CMake的Android非常陌生。但是,我试图将原生CMake库嵌入到Android应用程序中。但是,这个库依赖于OpenSSL。

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

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

 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)

2 个答案:

答案 0 :(得分:1)

find_package(...)在几个标准位置搜索图书馆(阅读here - 搜索&#34;在cmake&#34;中指定的搜索路径)。在您的情况下,它失败了,因为它无法在您尝试交叉编译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。也许有人有更好的方法,但唉,它解决了我当时的问题。

希望这有帮助

答案 1 :(得分:0)

未找到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)