cmake跨平台
C/C++项目可能需要支持的系统:iOS Android Linux Windows
使用场景:某个C/C++的功能库,需要能够在不同平台的项目中应用。
C/C++功能库需要能方便的生成多个平台下的库 一次编写到处编译
cmake工程目录结构
一个常见的cmake工程目录结构应当是这样的
.
├── CMakeLists.txt //顶层cmake文件
├── README.md //说明文件
├── build //cmake编译脚本目录
│ ├── Android
│ │ └── build_for_android.sh
│ ├── iOS
│ │ └── build_for_ios.sh
│ ├── linux
│ │ └── build_for_linux.sh
│ └── windows
│ └── build_for_win.sh
├── demo //库使用demo
│ ├── CMakeLists.txt
│ └── demo.c
├── inc //库头文件
│ └── src.h
├── project //可能用到的ide的存放目录
│ ├── android-studio
│ ├── visual-studio
│ └── xcode
└── src //库源文件
│ ├── CMakeLists.txt
| └── src.c
|── 3rdLibrary //依赖的第三方库
跨平台需要解决的问题
- 依赖的第三方库链接问题
不同的平台需要链接不同的库 所以首先 第三方依赖库需要编译出不同平台所使用的库
其次 cmake编译过程中需要能根据平台有选择的链接对应平台的库
- 动态库/静态库的选择
输出库的类型?
涉及第三方库的类型?
根据平台链接第三方库
build目录下创建对应平台的目录
├── Android
│ └── build_for_android.sh
├── iOS
│ └── build_for_ios.sh
├── linux
│ └── build_for_linux.sh
└── windows
└── build_for_win.sh
用脚本来控制不同平台的编译行为
在执行cmake时 传入平台定义变量
cmake -DPLATFORM_ANDROID ../../
cmake -D传入的宏定义可以在CMakeLists.txt中被读取
option(PLATFORM_ANDROID "android platform switch" OFF)
if (PLATFORM_ANDROID)
include_directories(${PROJECT_SOURCE_DIR}/3rdLibrary/xxx/android/inc)
link_directories(${PROJECT_SOURCE_DIR}/3rdLibrary/xxx/android/lib)
endif()
选择动态库/静态库
一般来说 对于依赖的第三方库 都是由C/C++功能库(动态库)去链接第三方依赖库(静态库)
这样做的好处是发布功能库时 只需要发布功能库的动态库 而不需要额外发布依赖的第三方库
这是由动态库和静态库的特性决定的
但也需要考虑这种情况 依赖的第三方库是多个功能库都同时依赖的 那么应该链接它的动态库
这样最终在项目中还需要再次链接这个依赖库的动态库 即编译功能库时需要链接 应用功能库时也需要链接