【问题标题】:How find package in CMake with a custom path for OpenCV framework in iOS如何在 CMake 中使用 iOS 中 OpenCV 框架的自定义路径查找包
【发布时间】:2015-10-17 08:49:18
【问题描述】:

我有 CMake 3.0 和我自己的 C++ iOS 项目,它们使用 OpenCV 作为依赖项。该项目生成一组由应用程序项目加载的库。

在我的 CMake 中,我尝试查找 OpenCV 依赖项,它会在 windows 和 linux 中自动查找,但在 Android 和 iOS 中我必须设置正确的包。对于 Android,使用以下代码设置 ${OpenCV_dir}/sdk/native/jni 工作属性:

SET(OpenCV_DIR NOT_FOUND CACHE PATH "Path to use OpenCV")
IF(OpenCV_DIR STREQUAL NOT_FOUND)
  FIND_PACKAGE( OpenCV PATHS ${OpenCV_DIR})
  MESSAGE(FATAL_ERROR "--***-- Warning: Install and configure path to prebuilt OpenCVConfig.cmake")
ENDIF()

在 iOS 中,这不起作用。我通常在没有找到 OpenCV 的情况下创建项目 Xcode 项目,然后我拖放框架并使用自定义路径手动配置变量框架搜索路径,在

/Users/Piperoman/Libraries/opencv2.4.9IOS

但使用 CMake 代码找不到它。

定位框架有什么问题?

【问题讨论】:

  • 您是否尝试将/Users/Piperoman/Libraries/ 添加到CMAKE_PREFIX_PATH,这是由FIND_XXX() 使用的?
  • First FIND_XXX() 我收到错误:将“OpenCV”的安装前缀添加到 CMAKE_PREFIX_PATH 或将“OpenCV_DIR”设置为包含上述文件之一的目录。如果“OpenCV”提供单独的开发包或SDK,请确保已安装。尝试添加 SET(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} /Users/Piperoman/Libraries/) 什么都不做,错误是一样的
  • 第一,CMAKE_PREFIX_PATH默认为空,而且是单路径不是列表,所以直接设置:SET(CMAKE_PREFIX_PATH /Users/Piperoman/Libraries/) 第二,我觉得很有可能你应该使用@987654328 @ 代表CMAKE_PREFIX_PATH。如 cmake 文档中所述,cmake 在CMAKE_PREFIX_PATH 下看起来像include/lib/ 之类的fir 目录
  • SET(CMAKE_PREFIX_PATH/Users/Piperoman/Libraries/opencv2.4.9IOS/) 不起作用。设置(OpenCVDID /Users/Piperoman/Libraries/opencv2.4.9IOS)两者都没有。在里面我只有 opencv2.framework 并且 CMake 似乎没有检测到。使用 Android 本机,我将 Opencv.Cmake 目录放入并完美运行。

标签: c++ ios xcode opencv cmake


【解决方案1】:

定位框架有什么问题?

find_package 寻找框架目录中不存在的OpenCVConfig.cmake 文件,即 OpenCV iOS 根本不是这样设计的。

您可以通过以下方式进行验证:

> wget http://sourceforge.net/projects/opencvlibrary/files/opencv-ios/3.0.0/opencv2.framework.zip
> unzip opencv2.framework.zip
> find opencv2.framework -type f -name "*.cmake"
# nothing found

与安卓比较:

> wget http://sourceforge.net/projects/opencvlibrary/files/opencv-android/3.0.0/OpenCV-3.0.0-android-sdk-1.zip
> unzip OpenCV-3.0.0-android-sdk-1.zip
> find OpenCV-android-sdk -type f -name "*.cmake"
...
OpenCV-android-sdk/sdk/native/jni/OpenCVConfig.cmake
...

如果您正在寻找 CMake 友好的解决方案,您可以尝试 Hunter 包管理器,请参阅 pkg.opencv

hunter_add_package(OpenCV)
find_package(OpenCV REQUIRED)

target_link_libraries(... PRIVATE ${OpenCV_LIBS})

Hunter iOS 使用说明

由于版本3.5 CMake 支持安装通用(多架构、设备+模拟器)iOS 库(请参阅CMAKE_IOS_INSTALL_COMBINED)。

Hunter 从0.13.1 版本开始使用此功能。

选择iOS toolchain,例如ios-8-2:

> git clone https://github.com/ruslo/polly
> ls polly/ios-8-2.cmake

CMakeLists.txt 将looks like this:

cmake_minimum_required(VERSION 3.5)

include("cmake/HunterGate.cmake")
HunterGate(
    URL "https://github.com/ruslo/hunter/archive/v0.13.1.tar.gz"
    SHA1 "bd7711df37a53134e642220d2f649a69cb34dde3"
)

project(TestOpenCV)

hunter_add_package(OpenCV)
find_package(OpenCV REQUIRED)

add_executable(foo foo.cpp)
target_link_libraries(foo PUBLIC ${OpenCV_LIBS})

构建它:

> cmake -H. -B_builds -DCMAKE_TOOLCHAIN_FILE=/.../polly/ios-8-2.cmake -GXcode
> cmake --build _builds --config Release

您也可以使用build.py 脚本来选择工具链和生成器:

> git clone https://github.com/ruslo/polly
> export PATH=`pwd`/polly/bin:$PATH
> which build.py

构建它(build.py 变体):

> build.py --toolchain ios-8-2 --verbose --config Release

【讨论】:

  • 在“/Users/Piperoman/Librerias/hunter-master/”中下载 Hunter 后,我得到:“Unknown CMake command “hunter_add_package”“我尝试手动添加它:SET(HUNTER_BINARY_DIR”/Users /Piperoman/Librerias/hunter-master/") INCLUDE(${HUNTER_BINARY_DIR}cmake/Hunter) 选项(HUNTER_ENABLED "Enable Hunter package manager" ON)我在 wiki 中找不到正确添加项目的说明,你知道在哪里他们是?
  • 嗯,我现在无法测试它,它使我的 ios 工具链失败。它的方法有点复杂,但感谢您的努力。如果没有人回答更简单的问题,我会给你赏金。我有一个带有 cmake 工具链和宏的小存储库:bitbucket.org/piperoman/cmakesupport,我将它用作我的项目中的子模块,如果我成功使用它,我将尝试将 Hunter 集成为自动工作的子模块。非常感谢。
  • 我的项目配置为使用我自己的工具链(来自子模块 cmakesupport)生成 XCode 项目,并且在配置 Cmake 时,HunterGate 启动错误 C 编译器未找到 (github.com/ruslo/hunter/wiki/error.abi.detection.failure) 我认为这是一个问题以我目前的配置。我将尝试一个新的简单项目来使其工作。我的意思是子模块,在我的工具中使用猎人门。
猜你喜欢
  • 1970-01-01
  • 2017-10-20
  • 2013-11-15
  • 2013-10-24
  • 2019-10-07
  • 2011-07-26
  • 2015-07-23
  • 1970-01-01
  • 2013-03-19
相关资源
最近更新 更多