转载自:https://github.com/Tencent/ncnn/wiki/cmake-%E6%89%93%E5%8C%85-ios-sdk

安装 xcode 和 cmake

xcode https://developer.apple.com/xcode/download

cmake OS X版本 https://cmake.org/download

默认情况 cmake 命令行可能用不了,需要手工加在 PATH 里面

export PATH=/Applications/CMake.app/Contents/bin/:$PATH
准备 ios toolchain 文件

把 ios.toolchain.cmake 放到和 CMakeLists.txt 同一级的项目目录里 可以去 opencv 的 github 上弄来,自己稍微调整下。
传送门 https://github.com/Itseez/opencv/tree/master/platforms/ios/cmake

编译方法
mkdir build-ios
cd build-ios
cmake -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_TOOLCHAIN_FILE=../ios.toolchain.cmake \
    -DIOS_PLATFORM=iPhoneOS \
    -DCMAKE_OSX_ARCHITECTURES=armv7 ..
make
make install
make package

没有遇到错误的话,手机平台 armv7 库已经编好了

这里简要介绍几个参数

  • IOS_PLATFORM 是平台名字,iPhoneOS 是真实机器的 ios,iPhoneSimulator 是模拟器平台
  • CMAKE_OSX_ARCHITECTURES 指定架构,iPhoneOS 配套 armv7 armv7s arm64,iPhoneSimulator 配套 i386 x86_64
CMakeLists.txt 要注意的地方

开头 project(XXX) 之前要加

if(CMAKE_TOOLCHAIN_FILE)
set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/install CACHE PATH "Installation Directory")
endif()

交叉编译通常不需要把文件装在主机上的,所以 CMAKE_INSTALL_PREFIX 设置为 build-android/install 这里

使用 opencv2.framework 这类第三方 sdk,需要指定这些 framework 的位置

set(CMAKE_FRAMEWORK_PATH "/Users/nihui/Downloads")
add_definitions(-F ${CMAKE_FRAMEWORK_PATH})

ios 平台默认不允许生成动态库

add_library(XXX SHARED ${XXX_SRCS}) 并没有效果,越狱设备除外

本文中的 ios toolchain 文件默认指定使用 libc++,最低系统需求为 ios 6.0

如果要修改这个配置,在 ios.toolchain.cmake 文件里

set (CMAKE_C_FLAGS_INIT "-isysroot ${CMAKE_OSX_SYSROOT} -miphoneos-version-min=6.0")
set (CMAKE_CXX_FLAGS_INIT "-stdlib=libc++ -fvisibility=hidden -fvisibility-inlines-hidden -isysroot ${CMAKE_OSX_SYSROOT} -miphoneos-version-min=6.0")

CMakeLists.txt 里头可以用 if(IOS) …. endif() 来判断是否给 ios 编译

ios 并不全是 arm 架构,如果要编译 neon 优化的源码文件,还要判断下处理器架构 当然最好还是别分成两个文件,在同一个 cpp 里用 __ARM_NEON 围起来

set(XXX_SRCS matrix_test.cpp)
if((IOS AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "armv7"))
    OR (IOS AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "armv7s"))
    OR (IOS AND ("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64")))
    # 这里是 arm 专门的源代码文件
    set(XXX_SRCS ${XXX_SRCS} matrix_mul_neon.cpp)
else()
    set(XXX_SRCS ${XXX_SRCS} matrix_mul_c.cpp)
endif()
参考资料

Compiling for iOS with CMake
https://stackoverflow.com/questions/12630970/compiling-for-ios-with-cmake

用CMake代替makefile进行跨平台交叉编译
http://www.cnblogs.com/wengzilin/p/4466708.html


会有那样的一天,你活成了你最想要的样子,过去所有的伤痕都变成了勋章 。