安卓CMake:找不到OpenSSL

31moq8wy  于 2022-11-11  发布在  其他
关注(0)|答案(4)|浏览(307)

我对Android的NDK / CMake还很陌生。不过,我正在尝试将一个原生的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'
    }
}

下面的代码如下所示:

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)
bzzcjhmw

bzzcjhmw1#

find_package(...)在几个标准位置搜索库(阅读here- search for“Search paths specified in 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})

我知道我也尝试过使find_package正确工作,通过使用它的一些配置属性,如CMAKE_FIND_ROOT_PATH,以及其他一些方法,但我无法完成它。
我不知道我提供的解决方案是否是最好的方法,也许有人有更好的方法,但可惜的是,它当时解决了我的问题。
希望这对你有帮助

qlfbtfca

qlfbtfca2#

找不到OpenSSL的原因是因为所有的find_*()命令都依赖于变量CMAKE_SYSROOT,该变量用于为这些命令搜索的路径添加前缀。在交叉编译时使用该变量指向目标环境的根目录。
一种解决方案是将OpenSSL所在的路径添加到CMAKE_FIND_ROOT_PATH; find_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)
jgwigjjp

jgwigjjp3#

对我来说,通过gradle导入openssl,然后像描述的here那样链接获取的lib是有效的

jyztefdp

jyztefdp4#

NO_CMAKE_FIND_ROOT_PATH附加到您的find_*命令,例如

find_package(OpenSSL REQUIRED NO_CMAKE_FIND_ROOT_PATH)

或者将CMAKE_FIND_ROOT_PATH_MODE_*变量(如this)设置为NEVER。以下选项为我修复了macOS上的Android和iOS构建:

-DOPENSSL_USE_STATIC_LIBS=TRUE \
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=NEVER \
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=NEVER

相关问题