构建C++跨平台静态库

问题描述 投票:0回答:2
我想用C++构建跨平台静态链接库。

我该怎么做(我是一个完全的NOOB,从来没有使用过g++,gcc,mingw等我在互联网上寻找解决我的问题的方法,但没有找到任何东西。除了mingw是一个极简主义GNU对于 Windows...)?我一直在 Windows 上使用 Visual C++,但现在我必须构建将附加到 Windows、Mac、Linux 的 Qt 项目的库。

如果有人知道关于使用编译器以及如何构建库的好教程,我将不胜感激在这里分享:)

谢谢,

愿原力与你同在

c++ cross-platform static-libraries
2个回答
0
投票
MinGW是一个非常好的编译器!我一直用它。尽管 MinGW 代表 Minimalist GNU for Windows,但 MinGW 拥有用 C++ 或 C 编程所需的一切。如果您要创建 QT 应用程序,我建议使用 QT Creator(只需 google 即可)。我最近没用过它,但我认为它支持跨平台编译(像 MinGW 一样,带有一些命令行命令......)。

交叉编译的最佳方法是获取要编译的每个操作系统的副本。因此,如果您使用的是 Windows、Mac 和 Linux,我建议您分别购买一台(Mac OS X 的价格约为 25 美元,Linux 是免费的)。然后只需使用附带的编译器(Mac 上的 XCode;Linux 上的 GCC)进行编译即可。不幸的是,当您执行交叉编译时,您需要单独支持每个操作系统(某些部分可以在操作系统之间共享)。

由于您将使用工具包(QT),因此您可能不必太担心平台特定的调用或其他任何事情。只需确保您使用 QT typedef 和结构,而不是 Microsoft Windows 的...


0
投票
首先,请记住,必须为您希望支持的所有硬件/操作系统目标单独编译静态库及其所有依赖项。

跨平台库的工作是一项困难但并非不可克服的任务。在 Windows 和更多 linuxy 目标之间进行跨平台工作时,最好的工具是 vcpkg。

它将管理跨目标的所有依赖项,包括 Visual Studio/Intel (Windows) 的 MSVC/Clang 以及更多 linuxy 编译器。它具有三元组或编码编译信息的概念,涵盖 x86 与 x64、静态或动态链接(有时甚至是静态与动态 C 运行时)。 您可以通过 vcpkg(在目标硬件/操作系统或虚拟机上)在每个目标上构建所有依赖项。 然后,在 Windows msvc 中,您可以指定用于依赖项的三元组。 如果在 Windows 或 Linux 上使用 CMAKE,请将 CMAKE 指向所需三元组的相应工具链文件。

Vcpkg 有相当不错的教程,一旦我掌握了单独编译所有依赖项的必要性,客观上并不难使用。 并且,在 Linux 中,了解有关 CMAKE 的更多信息。 这些完成了,这是我发现的最简单的工具。

我的库工作主要包括模板和 constexpr 代码,因此除了库本身的 C 运行时之外,我不需要任何依赖项。 我需要 boost 和一些其他依赖项来用于测试应用程序和示例演示,但不需要库本身。

你最终会发现这很棘手。 如果您正在 Windows 上使用静态 C 运行时构建静态库,那么您需要构建所有依赖项,以便它们静态链接,包括 C 运行时(如果您忽略这个细微差别,您可能不会立即注意到问题)。哦,版本需要全面相同。

如果您只想增强性能,也许还需要 facebook folly 等,您可能能够实现这一点(至少在 x64 Intel/AMD 的 Windows 上)。如果使用专有依赖项,则无法从源代码构建......祝你好运!

在 Linux 上,我从未让它在 100% 静态的一切上下文中工作。 向 Linux 专家询问 Windows 和 Linux 在这方面的区别。

vcpkg 的一大优点是,只要您的 deps 支持在该上下文中编译和链接,您就可以使用任何您想要的三元组。 因此,如果您愿意,它可以编译为静态和动态版本。 如果你不能让 Linux 中的一切都静态化。 也许一个 Linux 专家可以教我们一些关于在 Linux 中构建所有静态包含 C 运行时的东西。

希望这能让您开始。 总结

  1. 使用跨平台依赖管理工具(如果包含 Windows,则 vcpkg 最好;在 Linux 上它工作得很好,但如果您不支持 Windows,还有更多 linuxy 工具)。

  2. 了解使用与代码和所有其他依赖项相同的静态 C 运行时构建的所有依赖项(尤其是在静态上下文中)的重要性。

  3. 准备好目标硬件操作系统或虚拟机以用于每个目标。用于编译、链接和测试应用程序/示例代码。

  4. 您始终可以在平台上使其动态化,这是唯一合理的选择。

© www.soinside.com 2019 - 2024. All rights reserved.