构建 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++ 构建器将导出 CXX
和 CXX_FOR_BUILD
环境变量以指向 g++
或 clang++
,并相应地导出 CC
和 CC_FOR_BUILD
环境变量以指向 gcc
或 clang
。
在 macOS 上,gcc
是 clang
的别名,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 上,gcc
是 clang
的别名,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 #
要将 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 #
- 精确 附带 CMake 2.8.7
- Trusty 附带 CMake 3.9.2
- Xenial 附带 CMake 3.12.4
- Bionic 附带 CMake 3.12.4
- FreeBSD 附带 CMake 3.15.5
你可以从 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
的选择控制。