cmake跨平台工程应用

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中被读取

### 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++功能库(动态库)去链接第三方依赖库(静态库)
这样做的好处是发布功能库时 只需要发布功能库的动态库 而不需要额外发布依赖的第三方库
这是由动态库和静态库的特性决定的

但也需要考虑这种情况 依赖的第三方库是多个功能库都同时依赖的 那么应该链接它的动态库
这样最终在项目中还需要再次链接这个依赖库的动态库 即编译功能库时需要链接 应用功能库时也需要链接 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值