用cmake生成ios framework库

cmake ios framework

2019/5/5

代码下载

cmake-ios-demo 版本1
cmake-ios-demo 版本2

背景

如果你开发了一套c++代码,要在android和iphone两种手机上运行,就要在分别编译android和iphone两个平台下的动态库。

android开发目前是用 Android Studio(SDK/NDK), iphone开发是用XCode.

当你增加或减少一个源代码文件后,要在Android Studio和XCode内分别添加这个源代码。

随着时间的推移,源文件变来变去,你会烦不胜烦。

目的

本文描述如何用cmake,在android和iphone两个平台下,生成各自的库文件,供app调用.

版本1

代码目录结构

我准备的演示代码目录如下:

代码目录 描述
tvm_model 能生成 android 和 iphone两个平台的库.
tvm_model.hpp(开放给ios app调用)
tvm_model.cc(功能实现函数)
CMakeLists.txt : cmake 需要的项目文件
android 平台: cmake生成的文件是libtvm_model.so
ios 平台: cmake生成的文件是 tvm_model.framework
tvm_demo_android android app, 调用 libtvm_model.so 库内的函数.
tvm_demo_ios iphone app, 调用 tvm_model.framework 库内的函数.

检查cmake是否安装

用以下命令,确认你是否安装了cmake:
cmake --version

在我的mac机器上,输出是:
cmake version 3.13.1

制作CMakeLists.txt

根据CMake官方文档framework,resource,制作的CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.11)Project(tvm_model)add_library(tvm_model SHARED         tvm_model.cc         tvm_model.hpp)set(RESOURCE_FILESreadme.md# appresourcedir/appres.txt)set_target_properties(tvm_model PROPERTIESFRAMEWORK TRUEFRAMEWORK_VERSION AMACOSX_FRAMEWORK_IDENTIFIER cn.tvm.tvm_model# MACOSX_FRAMEWORK_INFO_PLIST Info.plist# "current version" in semantic format in Mach-O binary fileVERSION 1.0.0# "compatibility version" in semantic format in Mach-O binary fileSOVERSION 1.0.0PUBLIC_HEADER tvm_model.hppXCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"RESOURCE "${RESOURCE_FILES}")

编译出 tvm_model.framework

用以下命令编译出库文件:

cd ./tvm_demo1/src/tvm_modelmkdir buildcd    buildcmake ..make

Resources 没有被复制

我们期望 readme.md 被复制到 tvm_model.framework的Resources目录下,但是很上面的make命令生成的tvm_model.framework,却没有包含 readme.md.

参照cmake 打包 ios sdk, 我们可以把 readme.md, 复制到 tvm_model.framework 目录.

版本2

这次,我们用网上推荐的 ios-cmake 来试一下。
ios-cmake 需要cmake-3.14 版本,要下载安装一下。
仿照它的例子,制作编译的 CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.14)Project (tvm_model C CXX)# Includesinclude_directories(${tvm_model_SOURCE_DIR})set(RESOURCE_FILES1readme.md)add_library(tvm_model SHARED         tvm_model_c.cc         tvm_model_c.hpp         tvm_model.mm         tvm_model.h)# Debug symbols set in XCode projectset_xcode_property(tvm_model GCC_GENERATE_DEBUGGING_SYMBOLS YES "All")set(HEADER_FILES1tvm_model_c.hpptvm_model.h)set(RESOURCE_FILES1readme.md)set_target_properties(tvm_model PROPERTIESFRAMEWORK TRUEFRAMEWORK_VERSION AMACOSX_FRAMEWORK_IDENTIFIER cn.tvm.tvm_model# MACOSX_FRAMEWORK_INFO_PLIST Info.plist# "current version" in semantic format in Mach-O binary fileVERSION 1.0.0# "compatibility version" in semantic format in Mach-O binary fileSOVERSION 1.0.0PUBLIC_HEADER "${HEADER_FILES1}"RESOURCE      "${RESOURCE_FILES1}"# XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer")

然后,做一个build.sh,以便能反复编译(只编译模拟器版本):

#!/bin/bash[ -d "build" ] && rm -R build/mkdir buildcd buildcmake .. -G Xcode -DCMAKE_TOOLCHAIN_FILE=../ios.toolchain.cmake -DPLATFORM=SIMULATOR64cmake --build . --config Debugcmake --build . --config Releasecd ..

最后,把参考3内的example app复制一份,修改一下,引用我们的tvm_model.framework,就能在模拟器上跑起来了。

参考

  • 参考1: cmake 打包 ios sdk
  • 参考2: ios使用cmake编译framework
  • 参考3: ios-cmake
  • 参考4: cmake-3.14
  • 参考5: What is the difference between Embedded Binaries and Linked Frameworks
  • 参考6:Technical Note TN2435: Embedding Frameworks In An App

更多相关文章

  1. mac下编译ffmpeg1.1.4
  2. Android离线语音识别(SpeechRecognizer、PocketSphinx)
  3. Android(安卓)studio 常用插件合集
  4. android studio如何生成library project(库工程)
  5. Android(安卓)ART invoke 代码生成
  6. class文件生成dex文件的步骤(命令行操作)
  7. [Android] Dagger2 入门 2
  8. 如何用eclipse编译调试adnroid的Browser
  9. Android(安卓)编译时注解 —— 语法详解

随机推荐

  1. Android 简单视图
  2. Android TimePicker example
  3. android PhoneWindow
  4. 如何编译Android(安卓)ASE
  5. android 模拟软件启动界面
  6. Using Eclipse to compile Android sourc
  7. [Android] conversion to dalvik format
  8. android 应用程序性能跟踪
  9. android 取手机号码
  10. Android发送Email