【问题标题】:Multi platform C++ project setup and tools多平台 C++ 项目设置和工具
【发布时间】:2016-12-11 21:40:54
【问题描述】:

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

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

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

我的主要困境是:

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

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

【问题讨论】:

  • 一定要用cmake之类的工具。我建议先用 gcc 编译,然后用 visual 进行测试(先用 visual,用 gcc 编译时你可能会发现警告页面),但这是我的意见

标签: c++ cross-platform


【解决方案1】:

正如您所说,没有万能的解决方案,所以我将提出一些一般性建议。随意挑选您认为最有益的。

    • 如果您打算在主机操作系统上进行构建,cmake 听起来正是适合您的工具。它自我描述为“构建系统生成器”,其中抽象出在特定主机操作系统上构建的步骤,这意味着相同的设置“应该”适用于任何 cmake 支持的系统。
    • 如果您正在考虑交叉编译,那么您可能会因 iOS 和 MacOS 目标而受到伤害。据我所知,并且我已经努力尝试,Apple 不会为其系统发布不在其系统上运行的编译器 -> 您必须从 MacOS 计算机上为 iOS 和 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 特定的扩展。

【讨论】:

  • 谢谢,这很有用。只有一个问题 - 你所说的“过度杀伤解决方案”和“许可要求”是什么意思?使用 QT/qmake 是否意味着某种限制?
  • Qt 太过分了,因为它是一个相当大的依赖项,根据您的需要,这可能是也可能不是问题。 Qt 是在 LGPL 下获得许可的,其中某些部分是 GPL,或者您可以付费购买商业许可。 LGPL 在大多数情况下都不会破坏交易,但请务必仔细研究它以了解您正在处理的问题。
  • @Mithadis - 对不起,我昨天忘记给你加标签了。我想确保你看到了我的回应。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多