cmakeでios frameworkライブラリを生成する


cmakeでios frameworkライブラリを生成する
cmake ios framework
2019/5/5
コードのダウンロード
cmake-ios-demoバージョン1 cmake-ios-demoバージョン2
背景
c++コードを開発し、androidとiphoneの2つの携帯電話で実行するには、androidとiphoneの2つのプラットフォームの下のダイナミックライブラリをそれぞれコンパイルします.
Android開発は現在Android Studio(SDK/NDK)、iphone開発はXCode.
ソースファイルを1つ増やしたり減らしたりすると、Android StudioとXCodeにそれぞれこのソースコードを追加します.
時間が経つにつれて、ソースファイルが変わり、煩わしくなります.
目的
本文はcmakeを用いてandroidとiphoneの2つのプラットフォームの下で、app呼び出しのためにそれぞれのライブラリファイルを生成する方法を説明する.
バージョン1
コードディレクトリ構造
私が用意したプレゼンテーションコードのディレクトリは次のとおりです.
コードディレクトリ
説明
tvm_model
androidとiphoneの2つのプラットフォームのライブラリを生成することができます.
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アプリ、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_FILES
readme.md
# appresourcedir/appres.txt
)

set_target_properties(tvm_model PROPERTIES
FRAMEWORK TRUE
FRAMEWORK_VERSION A
MACOSX_FRAMEWORK_IDENTIFIER cn.tvm.tvm_model
# MACOSX_FRAMEWORK_INFO_PLIST Info.plist
# "current version" in semantic format in Mach-O binary file
VERSION 1.0.0
# "compatibility version" in semantic format in Mach-O binary file
SOVERSION 1.0.0
PUBLIC_HEADER tvm_model.hpp
XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
RESOURCE "${RESOURCE_FILES}"
)

tvm_をコンパイルmodel.framework
次のコマンドでライブラリファイルをコンパイルします.
cd ./tvm_demo1/src/tvm_model
mkdir build
cd    build
cmake ..
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)

# Includes
include_directories(${tvm_model_SOURCE_DIR})

set(RESOURCE_FILES1
readme.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 project
set_xcode_property(tvm_model GCC_GENERATE_DEBUGGING_SYMBOLS YES "All")

set(HEADER_FILES1
tvm_model_c.hpp
tvm_model.h
)

set(RESOURCE_FILES1
readme.md
)

set_target_properties(tvm_model PROPERTIES
FRAMEWORK TRUE
FRAMEWORK_VERSION A
MACOSX_FRAMEWORK_IDENTIFIER cn.tvm.tvm_model
# MACOSX_FRAMEWORK_INFO_PLIST Info.plist
# "current version" in semantic format in Mach-O binary file
VERSION 1.0.0
# "compatibility version" in semantic format in Mach-O binary file
SOVERSION 1.0.0
PUBLIC_HEADER "${HEADER_FILES1}"
RESOURCE      "${RESOURCE_FILES1}"
# XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
)

そして、buildを作ります.shを繰り返しコンパイルできるようにする(シミュレータバージョンのみをコンパイル):
#!/bin/bash

[ -d "build" ] && rm -R build/
mkdir build
cd build

cmake .. -G Xcode -DCMAKE_TOOLCHAIN_FILE=../ios.toolchain.cmake -DPLATFORM=SIMULATOR64

cmake --build . --config Debug
cmake --build . --config Release

cd ..

最後に、参考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 TN 2435:Embedding Frameworks In An App