如何编写真正的跨平台C ++库进行分发

时间:2019-01-08 01:51:48

标签: c++ cmake cross-platform

问题:

我正在编写主要是C ++的SDK。源代码将授权给付费的开发人员,输出库和包含标头将免费提供给公众使用。该SDK将针对众多平台,包括Windows,Xbox,Playstation,Android,iOS,Mac OS X和Linux。我是一个最喜欢Visual Studio,通常使用Windows机器开发软件的人。在过去的几年中,Visual Studio使其比以前容易得多,在这里,我有一条很清晰的路径,可以使用Visual Studio的一组项目文件作为事实源来针对所有上述平台。不幸的是,我的源代码文件在一起……除了Mac OSX。 Visual Studio能够通过分别分别与Mac或Linux盒进行远程接口进行编译和调试来构建iOS和Linux的可执行代码,这确实很酷,但是由于某些原因,这里没有将Mac OS X作为目标。另外,我很清楚,还有很多其他专业开发人员不会在Windows计算机上编写代码,他们也没有购买Visual Studio商业许可证的兴趣。

问题: 由于C ++仍然没有构建系统标准,而且可能从未使用过,因此我该如何维护一个单一的事实源,该目标源可以维护针对许多不同平台的所有源文件的构建配置,同时最大程度地减少了获得支持的障碍需要开发,运行和调试我的源代码的软件开发人员客户?

我知道的可能答案:

A)Visual Studio项目仍然是其他任何C ++项目类型(例如Android Studio,XCode和.make文件)的来源。我知道可以将VS转换为.make之类的工具,但实际上还没有尝试过(我的源代码库已经开始变得很大了)。或者,我可以咬一下子弹,然后手工书写它们,并尝试使它们保持同步。

B)CMake。叹。令人沮丧的是,它非常受欢迎,似乎可以完全解决我的问题,但是它有其自身的一系列问题,似乎是破坏交易的事情。对于初学者来说,一旦您进入CMake,您几乎无法返回。使用Visual Studio和属性表,我已经能够使用大多数情况下继承的属性和很少在项目和配置之间重复的属性来调整构建配置。据我所知,CMake并不关心尊重此类事物,对于通用属性,它只是在所有vcxproj文件中复制它们。更糟糕的是,它在输出项目中生成的所有文件路径都是绝对的,而不是相对的,并且最重要的是,它迫使其他构建您的代码的人使用CMake,不允许分发没有它创建的项目构建文件。另外,这甚至适用于游戏机吗?最后,我检查了我是否找到了不破坏源代码的合理方法来支持它们。

C)滚动我自己的脚本,该脚本类似于CMake,但允许重新分配其输出项目,并支持我需要的所有平台。不用说,这将花费大量的开发时间。

我在这里还缺少其他选择吗?非常感谢您的投入。

1 个答案:

答案 0 :(得分:1)

我同意@Scheff和@arrowd的评论。使用CMake。我已经构建了软件并将其部署到了多个平台,而CMake是我发现的用于构建C ++代码的最佳解决方案,尽管并非完美。

  • 我不必修改cmake代码即可使其在各种平台上运行。
  • 不要担心vcxproj文件中的属性重复。使用CMake时,构建语言位于CMakeLists.txt文件中。 vcxproj文件是生成的代码。只要您没有冗余的cmake逻辑,就不必关心生成的 vcxproj文件中的复制属性。同样,您不必关心生成的 vcxproj文件是否具有绝对路径。您不会重复使用vcxproj文件,而是为每个新平台或内部版本重新使用CMakeLists.txt文件和重新生成 vcxproj文件。
  • 使用顶级CMakeLists.txt定义所有目标通用的属性。然后,在单个目标中,CMakeLists.txt文件使用目标属性来调整特定目标的构建。以我的经验,在生成的文件中复制属性会有所帮助,因为它们使构建更加一致。我能够最小化源CMake逻辑中的复制。
  • 各种IDE(VS 2017,CLion,QtCreator)可以直接使用基于cmake的项目。
  • 关于生成的工件没有任何特定的说明。我们SDK的标头,库(和dll)以及可执行文件是独立的构件。是的,cmake可以使您的SDK用户更轻松,但是在SDK中使用CMake不会强迫您的客户使用CMake。

您尝试过CMake并且无法使用它吗?还是您在寻找更好的东西?当然,有多个C ++构建系统,但是尽管有缺点,我相信CMake是目前最好的系统。