无法为 iOS 构建 OpenCV 框架

Posted

技术标签:

【中文标题】无法为 iOS 构建 OpenCV 框架【英文标题】:Cannot build OpenCV framework for iOS 【发布时间】:2013-04-10 01:13:34 【问题描述】:

我在构建框架时遇到问题。

我从这里克隆了一份 OpenCV:https://github.com/Itseez/opencv

然后检查我有最新的cmake 2.8.10.2

然后在 ios 文件夹中运行 build_framework.py。

例如

./opencv/ios/build_framework.py opencv-ios-build

输出如下:

-- Setting up iPhoneOS toolchain
-- iPhoneOS toolchain loaded
-- Setting up iPhoneOS toolchain
-- iPhoneOS toolchain loaded
-- The CXX compiler identification is Clang 4.2.0
-- The C compiler identification is Clang 4.2.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - failed
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - failed
-- Performing Test HAVE_CXX_W
-- Performing Test HAVE_CXX_W - Failed
-- Performing Test HAVE_C_W
-- Performing Test HAVE_C_W - Failed
-- Performing Test HAVE_CXX_WALL
-- Performing Test HAVE_CXX_WALL - Failed
-- Performing Test HAVE_C_WALL
-- Performing Test HAVE_C_WALL - Failed
-- Performing Test HAVE_CXX_WERROR_RETURN_TYPE
-- Performing Test HAVE_CXX_WERROR_RETURN_TYPE - Failed
-- Performing Test HAVE_C_WERROR_RETURN_TYPE
-- Performing Test HAVE_C_WERROR_RETURN_TYPE - Failed
-- Performing Test HAVE_CXX_WERROR_NON_VIRTUAL_DTOR
-- Performing Test HAVE_CXX_WERROR_NON_VIRTUAL_DTOR - Failed
...

-- Could NOT find PythonInterp (missing:  PYTHON_EXECUTABLE) (Required is at least version "2.0")
-- Performing Test HAVE_CXX_WNO_UNDEF
-- Performing Test HAVE_CXX_WNO_UNDEF - Failed
-- Performing Test HAVE_CXX_WNO_SIGN_PROMO
-- Performing Test HAVE_CXX_WNO_SIGN_PROMO - Failed
-- Performing Test HAVE_CXX_WNO_MISSING_DECLARATIONS
-- Performing Test HAVE_CXX_WNO_MISSING_DECLARATIONS - Failed
-- Performing Test HAVE_CXX_WNO_MISSING_PROTOTYPES
-- Performing Test HAVE_CXX_WNO_MISSING_PROTOTYPES - Failed
-- Performing Test HAVE_OBJCXX_FOBJC_EXCEPTIONS
-- Performing Test HAVE_OBJCXX_FOBJC_EXCEPTIONS - Failed
-- Performing Test HAVE_CXX_WNO_DEPRECATED_DECLARATIONS
-- Performing Test HAVE_CXX_WNO_DEPRECATED_DECLARATIONS - Failed
-- 
-- General configuration for OpenCV 2.4.9 =====================================
--   Version control:               unknown
-- 
--   Platform:
--     Host:                        Darwin 12.3.0 i386
--     Target:                      iOS
--     CMake:                       2.8.10.2
--     CMake generator:             Xcode
--     CMake build tool:            /Applications/CMake 2.8-10.app/Contents/bin/cmakexbuild
--     Xcode:                       4.6.1
-- 
--   C/C++:
--     Built as dynamic libs?:      NO
--     C++ Compiler:                /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++  (ver 4.2.0)
--     C++ flags (Release):         -stdlib=libc++ -headerpad_max_install_names -fvisibility=hidden -fvisibility-inlines-hidden -fPIC   -DNDEBUG -O3 -fomit-frame-pointer -ffast-math  -DNDEBUG
--     C++ flags (Debug):           -stdlib=libc++ -headerpad_max_install_names -fvisibility=hidden -fvisibility-inlines-hidden -fPIC   -g  -O0 -DDEBUG -D_DEBUG -ggdb3
--     C Compiler:                  /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
--     C flags (Release):           -fPIC   -O3 -DNDEBUG  -DNDEBUG
--     C flags (Debug):             -fPIC   -g  -O0 -DDEBUG -D_DEBUG -ggdb3
--     Linker flags (Release):      
--     Linker flags (Debug):        
--     Precompiled headers:         NO
-- 
--   OpenCV modules:
--     To be built:                 core imgproc flann highgui features2d calib3d ml video objdetect contrib legacy nonfree photo softcascade stitching videostab world
--     Disabled:                    -
--     Disabled by dependency:      -
--     Unavailable:                 androidcamera gpu java ocl python superres ts
-- 
--   GUI: 
--     Cocoa:                       YES
--     OpenGL support:              NO
-- 
--   Media I/O: 
--     ZLib:                        build (ver 1.2.7)
--     JPEG:                        build (ver 90)
--     WEBP:                        NO
--     PNG:                         build (ver 1.5.12)
--     TIFF:                        NO
--     JPEG 2000:                   NO
--     OpenEXR:                     NO
-- 
--   Video I/O:
--     AVFoundation:                YES
--     QuickTime:                   NO
--     QTKit:                       YES
--     V4L/V4L2:                    NO/NO
-- 
--   Other third-party libraries:
--     Use IPP:                     NO
--     Use Eigen:                   NO
--     Use TBB:                     NO
--     Use OpenMP:                  NO
--     Use GCD                      YES
--     Use Concurrency              NO
--     Use C=:                      NO
--     Use Cuda:                    NO
--     Use OpenCL:                  NO
-- 
--   Python:
--     Interpreter:                 NO
-- 
--   Java:
--     ant:                         NO
--     JNI:                         NO
--     Java tests:                  NO
-- 
--   Documentation:
--     Build Documentation:         NO
--     Sphinx:                      NO
--     PdfLaTeX compiler:           NO
-- 
--   Tests and samples:
--     Tests:                       NO
--     Performance tests:           NO
--     C/C++ Examples:              NO
-- 
--   Install path:                  /Users/Ants/Dev/iOS/opencv-ios-build/build/iPhoneOS-armv7/install
-- 
--   cvconfig.h is in:              /Users/Ants/Dev/iOS/opencv-ios-build/build/iPhoneOS-armv7
-- -----------------------------------------------------------------
-- 
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/Ants/Dev/iOS/opencv-ios-build/build/iPhoneOS-armv7

但它确实构建了 Xcode 项目。

进程继续运行编译,但在 opencv 核心中的 rand.cpp 上失败

    /Users/Ants/Dev/iOS/opencv/modules/core/src/rand.cpp:758:8: error: unknown type name 'pthread_key_t'; did you mean 'pthread_attr_t'?
static pthread_key_t tlsRNGKey = 0;
       ^~~~~~~~~~~~~
       pthread_attr_t
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include/sys/signal.h:157:34: note: 'pthread_attr_t' declared here
typedef __darwin_pthread_attr_t         pthread_attr_t;
                                        ^
/Users/Ants/Dev/iOS/opencv/modules/core/src/rand.cpp:758:22: error: no viable conversion from 'int' to 'pthread_attr_t' (aka '_opaque_pthread_attr_t')
static pthread_key_t tlsRNGKey = 0;
                     ^           ~
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include/sys/_types.h:64:8: note: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const _opaque_pthread_attr_t &' for 1st argument
struct _opaque_pthread_attr_t  long __sig; char __opaque[__PTHREAD_ATTR_SIZE__]; ;
       ^
/Users/Ants/Dev/iOS/opencv/modules/core/src/rand.cpp:759:8: error: unknown type name 'pthread_once_t'; did you mean 'pthread_attr_t'?
static pthread_once_t tlsRNGKeyOnce = PTHREAD_ONCE_INIT;
       ^~~~~~~~~~~~~~
       pthread_attr_t
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk/usr/include/sys/signal.h:157:34: note: 'pthread_attr_t' declared here
typedef __darwin_pthread_attr_t         pthread_attr_t;
                                        ^
/Users/Ants/Dev/iOS/opencv/modules/core/src/rand.cpp:759:39: error: use of undeclared identifier 'PTHREAD_ONCE_INIT'
static pthread_once_t tlsRNGKeyOnce = PTHREAD_ONCE_INIT;
                                      ^
/Users/Ants/Dev/iOS/opencv/modules/core/src/rand.cpp:774:5: error: use of undeclared identifier 'pthread_once'
    pthread_once(&tlsRNGKeyOnce, makeRNGKey);
    ^
5 errors generated.

有什么想法吗?

【问题讨论】:

顺便说一句,我可以使用 cmake 毫无问题地构建 OSX 库。 【参考方案1】:

线索就在这条线上:

-- Could NOT find PythonInterp (missing: PYTHON_EXECUTABLE) (Required is at least version "2.0")

我通过编辑 build_framework.py 文件来解决这个问题,将 python 的路径添加到 cmakeargs 部分(大约第 39 行):

cmakeargs = ("-GXcode " +
             "-DPYTHON_EXECUTABLE=/usr/bin/python " +
             "-DCMAKE_BUILD_TYPE=Release " +
             "-DCMAKE_TOOLCHAIN_FILE=%s/ios/cmake/Toolchains/Toolchain-%s_Xcode.cmake" +
             "-DBUILD_opencv_world=ON " +
             "-DCMAKE_INSTALL_PREFIX=install") % (srcroot, target)

或者(它比从头编译要快得多)使用cocoapods 来安装依赖项。

【讨论】:

谢谢我会试试这个然后更新。我喜欢使用 cocoapods 的想法。

以上是关于无法为 iOS 构建 OpenCV 框架的主要内容,如果未能解决你的问题,请参考以下文章

无法将 opencv2-2 框架添加到 iOS 项目

学习 opencv---(11)OpenC 边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器

如何构建使用 OpenCV 的 XCode 6 iOS 应用程序 - 未定义错误 __cplusplus

在 iOS 中找不到 opencv 框架

无法让 OpenCV 框架符号在 XCode 中链接

使用 MingW 运行 OpenCV 项目时出现入口点错误