gpt4 book ai didi

c++ - 如何编写真正跨平台的 C++ 分发库

转载 作者:太空狗 更新时间:2023-10-29 22:54:50 25 4
gpt4 key购买 nike

问题:

我正在编写一个主要是 C++ 的 SDK。源代码将授权给付费的开发人员,输出库和包含的 header 将免费供公众使用。该 SDK 将面向众多平台,包括 Windows、Xbox、Playstation、Android、iOS、Mac OS X 和 Linux。我是那种最喜欢 Visual Studio 并且通常使用 Windows 机器开发软件的人。在过去的几年里,Visual Studio 使这比以前容易得多,我有一个非常清晰的路径来定位所有前面提到的平台,使用 Visual Studio 的项目文件集作为真实的来源,带来所有我的源代码文件放在一起……不幸的是,Mac OS X 除外。 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 并不关心尊重这些东西,对于公共(public)属性,它只是在所有 vcxproj 文件上复制它们。更糟糕的是,它在输出项目中生成的所有文件路径都是绝对的,而不是相对的,最重要的是,它会强制任何其他构建您的代码的人使用 CMake,禁止分发它创建的项目构建文件,而不是它.另外,这甚至适用于游戏机吗?最后我检查了一下,我找不到不破解源代码的合理方式来支持它们。

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

我在这里缺少任何其他选项吗?非常感谢您的意见。

最佳答案

我同意@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 的项目。
  • 对于生成的工件,cmake 没有任何具体说明。我们 SDK 的 header 、库(和 dll)和可执行文件是独立的工件。是的,cmake 可以让您的 SDK 用户更轻松,但在您的 SDK 中使用 CMake 不会强制您的客户使用 CMake。

您是否尝试过 CMake 但无法使用它?或者您正在寻找更好的东西?当然有多种 C++ 构建系统,但尽管有缺点,我相信 CMake 是目前可用的最好的系统。

关于c++ - 如何编写真正跨平台的 C++ 分发库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54084278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com