手里有个C++的CMake工程,想要针对不同的平台编译,包括WindowsLinuxmacOS。其中Linux又包含了x64arm32树莓派)和arm64Jetson Nano)。没有相应的设备怎么办?Travis CI提供了各种操作系统和CPU指令集的虚拟机,可以满足需求。

配置CMakeLists.txt

我手里有5个不同平台的动态链接库:

  • x64 Windows
  • x64 Linux
  • ARM32 Linux
  • ARM64 Linux
  • macOS

分别放在5个目录里。

现在需要在CMakeLists.txt中根据不同的条件来链接不同的库。

首先区分操作系统:

if (CMAKE_HOST_WIN32)set(WINDOWS 1)
elseif(CMAKE_HOST_APPLE)set(MACOS 1)
elseif(CMAKE_HOST_UNIX)set(LINUX 1)
endif()

然后用CMAKE_SYSTEM_PROCESSOR来区分处理器:

if(WINDOWS)MESSAGE( STATUS "Link directory: ${PROJECT_SOURCE_DIR}/platforms/win/lib/" )link_directories("${PROJECT_SOURCE_DIR}/platforms/win/lib/")
elseif(LINUX)if (CMAKE_SYSTEM_PROCESSOR STREQUAL x86_64)MESSAGE( STATUS "Link directory: ${PROJECT_SOURCE_DIR}/platforms/linux/" )link_directories("${PROJECT_SOURCE_DIR}/platforms/linux/")elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l OR ARM32_BUILD)MESSAGE( STATUS "Link directory: ${PROJECT_SOURCE_DIR}/platforms/arm32/" )link_directories("${PROJECT_SOURCE_DIR}/platforms/arm32/") elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL aarch64) MESSAGE( STATUS "Link directory: ${PROJECT_SOURCE_DIR}/platforms/aarch64/" )link_directories("${PROJECT_SOURCE_DIR}/platforms/aarch64/") endif()
elseif(MACOS)MESSAGE( STATUS "Link directory: ${PROJECT_SOURCE_DIR}/platforms/macos/" )link_directories("${PROJECT_SOURCE_DIR}/platforms/macos/")
endif()

根据官方文档,Travis CI不提供ARM32的虚拟机。


我们可以在ARM64的虚拟机上编译ARM32的工程,但是这样会导致CPU判断条件失效。解决方法是增加一个CMake的编译选项:

option(ARM32_BUILD "Build for ARM32" OFF)

配置travis.yml

接下来在工程根目录中创建travis.yml

配置5个任务:

jobs:include:- os: linuxarch: arm64env: OS=arm64_linux- os: linuxarch: amd64env: OS=amd64_linux- os: windowsarch: amd64env: OS=windows- os: osxarch: amd64env: OS=osx- os: linuxarch: arm64env: OS=arm32_linuxbefore_install:- sudo dpkg --add-architecture armhf- sudo apt-get update- sudo apt-get install crossbuild-essential-armhf libc6:armhf libstdc++6:armhf

对于ARM32,要预先安装交叉编译器。

添加脚本:

script:- mkdir build- cd build- if [[ ${TRAVIS_OS_NAME} == "windows" ]]; thencmake -DCMAKE_GENERATOR_PLATFORM=x64 ..;elseif [ $OS == "arm32_linux" ]; thenexport CC=arm-linux-gnueabihf-gcc;export CXX=arm-linux-gnueabihf-g++;export AR=arm-linux-gnueabihf-ar;cmake -DARM32_BUILD=TRUE ..;elsecmake ..;fifi- cmake --build . --config release

Windows如果不加-DCMAKE_GENERATOR_PLATFORM=x64,生成的是x86工程。ARM32编译的时候,导出编译器,并添加编译选项-DARM32_BUILD=TRUE

在https://travis-ci.com/上使用GitHub账号登陆,选中仓库就可以触发编译了。


最后把状态图标加入到README.md中:

[![status](https://api.travis-ci.com/Dynamsoft/cmake.svg?branch=master)](https://travis-ci.com/github/Dynamsoft/cmake)

源码

https://github.com/Dynamsoft/cmake

使用Travis CI实现C++ CMake工程多平台编译相关推荐

  1. Hi3516DV300 Cmake工程建立教程

    Hi3516DV300 Cmake工程建立教程 一.准备事项 二.建立基本的Cmake工程 三.提取SDK完善Cmake工程 四.编译与调试 五.总结 一.准备事项 1.以默认路径安装交叉编译器arm ...

  2. iOS中 为 iOS 建立 Travis CI 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang新浪微博! 你是否曾经试着为 iOS 项目搭建一台支持持续集成的服务器,从我的个人经验而言,这可不是一个轻松的活.首先需要准备一台 ...

  3. 为iOS建立Travis CI(史上最全版)

    前段时间由于公司需求,我为Github代码仓库配置travis,找了很多资料发现都不细致而且还有问题,对于我这种第一次配置的人来说花了一个多月才配置好.下面我提供大家最全的配置方法(其中绿色字体是.t ...

  4. 【Qt】QtCreator导入cmake工程

    QtCreator导入cmake 一.ubuntu系统 1.配置cmake编译套件 2.导入cmake工程 二.windows系统 1.下载cmake 2.安装cmake 3.设置环境变量 4.添加c ...

  5. Travis CI : 最小的分布式系统(三)

    日志的作用有两个:当构建日志的数据块通过消息队列进来时,更新数据库对应行,然后推送它到Pusher用于实时的用户界面更新. 日志块以流的形式在同一个时间从不同的进程中进来,然后被一个进程处理.这个进程 ...

  6. Travis CI : 最小的分布式系统(二)

    大约1年之前,我们发现当时的架构有些不合理了.尤其是Hub,它上面承担了太多的任务.Hub要接收新的处理请求,处理并推动构建日志,它要同步用户信息到Github,它要通知用户构建是否成功.它跟一大群外 ...

  7. Travis CI : 最小的分布式系统(一)

    (本文翻译自http://www.paperplanes.de/2013/10/18/the-smallest-distributed-system.html,由@金斌_jinbin 翻译) Trav ...

  8. travis-ci自动部署_如何使用Travis CI部署(几乎)零恐惧的Cloud Foundry应用

    travis-ci自动部署 by Robin Bobbitt 罗宾·波比(Robin Bobbitt) 如何使用Travis CI部署(几乎)零恐惧的Cloud Foundry应用 (How to d ...

  9. travis ci_如何使用Travis CI和GitHub进行Web开发工作流程

    travis ci by Vijayabharathi Balasubramanian 通过Vijayabharathi Balasubramanian 如何使用Travis CI和GitHub进行W ...

  10. Flutter GitHub Travis CI 搭建

    通过 Travis CI 连接 GitHub 上的 Flutter 项目, 实现持续集成: 代码扫描, 测试, 打包发布 release. Install Android SDK os: linuxl ...

最新文章

  1. 妹妹生了个女儿,纪念一下
  2. 【CentOS Linux 7】实验1【Linux文件目录管理】
  3. Matlab插值方法大全
  4. 将已有项目转为se项目_威海将再添国家级非遗项目
  5. 向右滑动返回Activity
  6. 百度再回应“泼水门”:强烈谴责 肇事者已被公安机关带走
  7. 大数乘法与大数加法 java实现
  8. java子弹集合_Java使用线程并发库模拟弹夹装弹以及发射子弹的过程
  9. matlab半导体器件仿真,半导体软件 - 仿真模拟半导体器件的物理场
  10. 学校教学的计算机网络教室它的网络类型,用于学校教学的计算机网络教室,它的网络类型属于( )...
  11. python列表字符全部改为大写_将包含字符串的Python列表转换为小写或大写
  12. hdu6287 口算训练
  13. 可爱的病毒——电脑病毒竟然被程序员当宠物养!
  14. 计算机科学管理学专业大学排名,2020管理科学专业大学排名
  15. 安卓选择市区的省市区联动
  16. 微信 获取 用户信息访问授权管理
  17. 整理了500万+微信红包封面,速抢!
  18. 〖Python语法进阶篇②〗- 线程与多线程概述
  19. 流氓软件自动安装恶意插件导致浏览器闪退问题
  20. java, c 亦或用法

热门文章

  1. 心田花开:小学三年级语文下册古诗词整理【全】
  2. 目标检测中的常见指标
  3. ESP32-C3编译问题
  4. 《惢客创业日记》2019.03.04(周一)从创业角度看郭德纲(2)
  5. linux清理垃圾文件,linux如何清理系统垃圾
  6. 怎样用计算机玩CS,电脑建立局域网玩cs的三种方法
  7. quartz mysql 表 集群配置_Quartz集群配置
  8. 代理服务器的安全证书有问题 错误代码8,如何修复Internet Explorer 8中的证书错误...
  9. 堡垒机(运维审计系统)的基本原理与部署方式
  10. mysql身份证来算年龄_MySQL 根据身份证出生年月计算年龄户籍地性别