介绍
本系列是SDK打包的实践,主要解决一下3个问题
【iOS开发】SDK开发之编译c/c++
【iOS开发】SDK开发之podspec编写
【iOS开发】SDK开发之podspec内执行脚本
本期问题
SDK的源码是由其他团队编写,使用的语言为c/c++,且会依赖第三方的库(也是c/c++编写)。
考虑有以下几种方案:1 Xcode编译 2 cmake编译
一 Xcode编译步骤
1 使用Xcode创建Framework项目
2 添加所有使用的c/c++文件(依赖的第三方的文件)
3 调整暴露的头文件public headers
4 编译(command+B)
优点:
Xcode原生IDE加持,可视化好,操作简单
缺点:
1 需要运行在mac电脑上(iOS开发肯定有mac电脑,but如果需要编写团队来编译就不行了,因为他们是linux环境)
2 第三方依赖需要我们手动配置(尤其在依赖文件有变化的时候,需要跨团队沟通)
二 cmake编译步骤
1 编写cmake脚本
2 执行cmake脚本
优点:
1 运行在任何有cmake环境的电脑(linux/mac均可)
2 cmake支持嵌套,直接嵌套使用编写团队使用的cmake
3 脚本编写简单,维护成本低
4 可接CI/CD
最后附上打包SDK的cmake(嵌套的cmake就不贴了)
cmake_minimum_required(VERSION 3.14)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_C_COMPILER "clang")
message(STATUS "compile iOS")
# 设置工程名称
project(HelloFramework)
set(BUILD_SHARED_LIBS ON)
# 设置目标平台为 iOS
set(CMAKE_SYSTEM_NAME Darwin)
set(CMAKE_OSX_SYSROOT iphoneos)
set(CMAKE_OSX_ARCHITECTURES arm64)
# 设置生成的 iOS 最低版本,假设是 iOS 11.0
set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0")
# 设置为生成 Framework 类型
set(CMAKE_MACOSX_BUNDLE YES)
set(CMAKE_FRAMEWORK TRUE)
# 添加源文件
set(PUBLIC_INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/algorithms/mobie_lib_test/src/align_interface)
set(SOURCE_FILES STATIC ${PUBLIC_INTERFACE}/incremental_align_c_api.h)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../3rd/iOS/dependence/eigen337/cmake)
set(EIGEN3_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../3rd/iOS/dependence/eigen337)
message("CMAKE_CURRENT_SOURCE_DIR" ${CMAKE_CURRENT_SOURCE_DIR})
find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIR})
message("EIGEN3_INCLUDE_DIR" ${EIGEN3_INCLUDE_DIR})
set(OpenCV_LIBS ${CMAKE_CURRENT_SOURCE_DIR}/../3rd/iOS/lib/opencv2.framework/opencv2)
set(OpenCV_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../3rd/iOS/lib/opencv2.framework/Headers)
message("OpenCV_INCLUDE_DIRS" ${OpenCV_INCLUDE_DIRS})
set(Boost_LIBRARIES ${CMAKE_CURRENT_SOURCE_DIR}/../3rd/iOS/lib/boost/libboosttt.a)
set(Boost_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../3rd/iOS/lib/boost/include)
include_directories(${Boost_INCLUDE_DIRS})
set(MNN_LIBS ${CMAKE_CURRENT_SOURCE_DIR}/../3rd/iOS/lib/MNN.framework/MNN)
set(MNN_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../3rd/iOS/lib/MNN.framework/Headers)
message("MNN_INCLUDE_DIRS" ${MNN_INCLUDE_DIRS})
set(GLOG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../3rd/iOS/lib/ceres/include/ceres/internal/miniglog ${CMAKE_CURRENT_SOURCE_DIR}/../3rd/iOS/lib/ceres/include)
message("GLOG_INCLUDE_DIRS" ${GLOG_INCLUDE_DIRS})
include_directories(${GLOG_INCLUDE_DIRS})
set(G2O_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../3rd/iOS/lib/g2o)
include_directories(${G2O_INCLUDE_DIRS})
set(PNG_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../3rd/iOS/dependence/png)
include_directories(${PNG_INCLUDE_DIRS})
message("PNG_INCLUDE_DIRS" ${PNG_INCLUDE_DIRS})
#设置libg2
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/algorithms/mobile_pose_align_lib/third_part/g2o_tool/g2o/core)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/algorithms/mobile_pose_align_lib/third_part/g2o_tool) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/algorithms/mobile_pose_align_lib/third_part/g2o_tool)
add_subdirectory(algorithms)
# # 设置输出路径(可选)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/frameworks)