构建 C++ 项目

本指南涵盖的内容 #

有关语言版本和其他构建环境特定信息,请访问我们的参考页面

本指南涵盖了特定于 C++ 项目的构建环境和配置主题。请务必先阅读我们的 教程通用构建配置 指南。

C++ 项目的 CI 环境 #

Travis CI VM 是 64 位的,并提供以下版本的

  • gcc
  • clang
  • 核心 GNU 构建工具链(autotools、make)、cmake、scons

Travis CI 上的 C++ 项目默认情况下假设你使用 Autotools 和 Make。

有关 VM 上的精确版本,请参阅构建日志中的“构建系统信息”。

依赖项管理 #

由于社区中没有关于依赖项管理的主导约定,因此 Travis CI 会跳过 C++ 项目的依赖项安装。

如果在测试运行之前需要安装依赖项,请覆盖你的 .travis.yml 中的 install: 键。

install: make get-deps

有关详细信息,请参阅 构建配置指南

选择要测试的编译器 #

你可以针对 GCC 或 Clang,或两者都进行项目测试。为此,请使用 .travis.yml 中的 compiler: 键指定要使用的编译器。例如,要使用 Clang 进行构建

compiler: clang

或 GCC 和 Clang

compiler:
  - clang
  - gcc

针对两个编译器进行测试将在你的构建矩阵中创建(至少)两行。对于每一行,Travis CI C++ 构建器将导出 CXXCXX_FOR_BUILD 环境变量以指向 g++clang++,并相应地导出 CCCC_FOR_BUILD 环境变量以指向 gccclang

在 macOS 上,gccclang 的别名,g++clang++ 的别名。设置特定 GCC 版本 以在 macOS 上使用 GCC。

示例 #

OpenMP 项目 #

OpenMP 项目应将环境变量 OMP_NUM_THREADS 设置为一个合理的小值(例如,4)。OpenMP 会检测托管硬件上的内核,而不是运行测试的 VM。

MPI 项目 #

默认环境变量 $CC$CXX 已知会干扰 MPI 项目。在这种情况下,我们建议取消设置它

before_install:
  - test -n $CC  && unset CC
  - test -n $CXX && unset CXX

C11/C++11(及更高版本)和工具链版本控制 #

如果你的项目需要与 C11、C++11 或更新的语言标准兼容的工具,则你可能需要升级编译器和/或构建工具。本节专门介绍如何升级 GCC、clang 和 cmake;对于其他依赖项,请参阅 安装依赖项

Linux 上的 GCC #

请注意,GCC 对 ISO C11 的支持在 4.9 中达到了与 ISO C99 相似的完整程度,C++11 在 5.1 中功能完整(C++ 语言支持在 4.8.1 中功能完整,但标准库直到 稍后 才支持所有 C++11 功能,特别是在 4.9 之前不存在对 <regex> 的支持)。

要将 GCC 升级到更新版本,你必须从 ubuntu-toolchain-r-test 源安装适当的版本;有关示例,请参见下文

matrix:
  include:
    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - g++-4.9
      env:
         - MATRIX_EVAL="CC=gcc-4.9 && CXX=g++-4.9"

    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - g++-5
      env:
         - MATRIX_EVAL="CC=gcc-5 && CXX=g++-5"

    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - g++-6
      env:
        - MATRIX_EVAL="CC=gcc-6 && CXX=g++-6"

    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
          packages:
            - g++-7
      env:
        - MATRIX_EVAL="CC=gcc-7 && CXX=g++-7"

before_install:
    - eval "${MATRIX_EVAL}"

macOS 上的 GCC #

在 macOS 上,gccclang 的别名,g++clang++ 的别名。因此你必须将 CC 和 CXX 设置为特定的 gcc/g++ 版本

matrix:
  include:
    - os: osx
      osx_image: xcode8
      env:
        - MATRIX_EVAL="CC=gcc-4.9 && CXX=g++-4.9"

    - os: osx
      osx_image: xcode8
      env:
        - MATRIX_EVAL="brew install gcc5 && CC=gcc-5 && CXX=g++-5"

    - os: osx
      osx_image: xcode8
      env:
        - MATRIX_EVAL="brew install gcc6 && CC=gcc-6 && CXX=g++-6"

    - os: osx
      osx_image: xcode8
      env:
        - MATRIX_EVAL="brew install gcc && CC=gcc-7 && CXX=g++-7"

before_install:
    - eval "${MATRIX_EVAL}"

FreeBSD 上的 GCC #

Travis CI FreeBSD 映像附带 GCC 10.0.0(它默认情况下不在基本系统中)。

要将 GCC 升级到更新版本,请从软件包中安装适当的版本;有关示例,请参见下文

os: freebsd
addons:
    pkg:
      - gcc10
    env:
      - CC=gcc10
      - CXX=g++10

Linux 上的 Clang #

请注意,C++11 支持从 Clang 3.3 开始完成

要将 Clang 升级到更新版本,你必须从 llvm-toolchain-* 源安装适当的版本(还必须为依赖项解析引入 ubuntu-toolchain-r-test 源);有关示例,请参见下文

matrix:
  include:
    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-precise-3.6
          packages:
            - clang-3.6
      env:
        - MATRIX_EVAL="CC=clang-3.6 && CXX=clang++-3.6"

    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-precise-3.7
          packages:
            - clang-3.7
      env:
        - MATRIX_EVAL="CC=clang-3.7 && CXX=clang++-3.7"

    # works on Precise and Trusty
    - os: linux
      addons:
        apt:
          sources:
            - ubuntu-toolchain-r-test
            - llvm-toolchain-precise-3.8
          packages:
            - clang-3.8
      env:
        - MATRIX_EVAL="CC=clang-3.8 && CXX=clang++-3.8"

    # works on Trusty
    - os: linux
      addons:
        apt:
          sources:
            - llvm-toolchain-trusty-3.9
          packages:
            - clang-3.9
      env:
        - MATRIX_EVAL="CC=clang-3.9 && CXX=clang++-3.9"

    # works on Trusty
    - os: linux
      addons:
        apt:
          sources:
            - llvm-toolchain-trusty-4.0
          packages:
            - clang-4.0
      env:
        - MATRIX_EVAL="CC=clang-4.0 && CXX=clang++-4.0"

    # works on Trusty
    - os: linux
      addons:
        apt:
          sources:
            - llvm-toolchain-trusty-5.0
          packages:
            - clang-5.0
      env:
        - MATRIX_EVAL="CC=clang-5.0 && CXX=clang++-5.0"

before_install:
    - eval "${MATRIX_EVAL}"

macOS 上的 Clang #

在 macOS 上,clang 的版本由 osx_image 的选择控制。你可以 在这里 找到可用的 osx_image 列表。

matrix:
  include:
    - os: osx
      osx_image: xcode10.1

    - os: osx
      osx_image: xcode9.4

你可以 在这里 找到 Xcode 附带的 clang 版本。

FreeBSD 上的 Clang #

Clang 是 FreeBSD 上的默认编译器

FreeBSD 附带 Clang 8.0.1

要将 Clang 升级到更新版本,请从软件包中安装适当的版本;有关示例,请参见下文

os: freebsd
addons:
    pkg:
      - llvm90
    env:
      - CC=/usr/local/bin/clang90    # llvm90 installs it to /usr/local/bin/clang90
      - CXX=/usr/local/bin/clang++90 # llvm90 installs it to /usr/local/bin/clang++90

Clang 是 FreeBSD 上的默认编译器

CMake #

你可以从 george-edison55-precise-backports 源将 cmake 升级到 Precise 上的 3.2.3(请注意,cmake-data 软件包包含 Aptitude 不会自动解决的依赖项),参见

addons:
  apt:
    sources:
      - george-edison55-precise-backports
    packages:
      - cmake-data
      - cmake

在 macOS 上,cmake 的版本由 osx_image 的选择控制。