多平台 C++ 项目设置和工具

Multi platform C++ project setup and tools

我的任务是创建一个 C++ SDK - 很可能是动态库的形式。

它应该在不同的平台上使用 - Windows(32/64 位),Linux(32/64 位),Mac OS、AndroidiOS。我在多平台项目设置方面没有太多经验,我正在尝试决定使用哪些方法和工具来实现最简单的开发和部署。

旁注:我还必须在 Bamboo CI 服务器上准备自动构建(作业),以便 运行 编译和测试每个所需的目标。

我的主要困境是:

  1. 项目设置。我应该准备不同的项目架构以在不同的平台上使用(例如 Windows 上的 .sln 和 Linux 上的 makefile),还是尝试使用像 CMake 这样的工具?甚至可以准备一个适合所有这些目标平台的 CMake 项目吗?
  2. 编译工具链。我应该为每个平台使用 "native" C++ 编译器(比如 Windows 上的 MSVC 和 Linux 上的 GCC),还是像 Clang + LLVM 这样的单一工具链? Clang + LLVM(显然还有一些链接器)是否能够为我需要的所有这些平台构建可分发的二进制文件?
  3. 开发环境。哪个 OS/IDE 最适合从事此类项目?我更喜欢在 Windows 上工作,而我通常的 IDE 是 Visual Studio - 在这种情况下它是否可行,或者其他更合适的东西?

我知道我的问题非常复杂,对于这些要点中的任何一点都没有直接的答案,但是每一个建议甚至部分答案都会非常感激:)

您很可能需要多个工具链(您提到了 C++,但它没有 ABI,因此要在 Windows 上可用,您或多或少需要使用 CL 进行构建)。因此,您将无法使用单个供应商特定的项目设置。随着项目的增长,维护多个版本的项目文件很快变得难以为继,因此您选择构建系统至关重要。查看 Shake 并与具有相似功能集的替代方案进行比较。 IDE 的选择不太重要 - 许多程序员更喜欢他们最喜欢的编辑器(Emacs 或 Vim),并且可能需要在任何支持的平台上工作。

正如你所说,没有一刀切的解决方案,所以我会提出一些一般性的建议。随意挑选你觉得最有益的。

    • 如果您计划在主机 OS 上进行构建,cmake 听起来正是适合您的工具。它自我描述为 "build system generator",其中抽象了在特定主机 OS 上构建的步骤,这意味着相同的设置 "should" 适用于任何 cmake 支持的系统。
    • 如果您正在考虑交叉编译,那么您会因 iOS 和 MacOS 目标而受到一些伤害。据我所知,并且我已经付出了一些努力来尝试,Apple 不会为他们的系统发布编译器,因为他们的系统上没有 运行 -> 你必须为 iOS 和 MacOS 来自 MacOS 计算机。如果你能在这一点上证明我是错的,我会很高兴听到:)
    • 根据您的许可要求,如果您真的想要一个矫枉过正的解决方案,您可以查看 Qt* 和 qmake。我对他们的多体系结构解决方案感到非常幸运,Qt 支持您在原始问题中列出的所有系统。我发现 Qt + qmake 比 cmake 更容易处理。

* 是的,Qt 在非 GUI 方面也做得很好!

  1. 我在 1. 的第二点中提到了这一点,但我的一般建议是使用本机工具链。不包括 MacOS,很容易设置虚拟机、构建服务器等来构建本机代码,而我使用交叉编译器的经验是它们总是增加另一层心痛,甚至比必须远程访问更糟糕一台单独的生成器计算机。

  2. 只要避免依赖于系统的头文件、库或扩展,使用什么系统都没有关系。 <windows.h><linux/*.h> 之类的东西很明显,但是验证跨平台兼容性的最佳方法是尽可能多地测试外国系统。

    • 与使用的编译器无关,我建议打开所有警告。它们通常很重要,并且可能表明编译器能够解决问题但尝试为另一个系统编译会失败的地方。如果您在团队中工作,最好设置警告以导致构建错误,以确保团队的其他成员与您一样严谨。
    • 我不知道 LLVM 或 MSVC,但如果你给它 -pedantic-ansi 标志,GCC 会给你一些关于平台特定扩展的提示。正如所解释的 here,这些标志告诉 GCC 对任何特定于 GNU 的扩展发出警告。