在 Windows 上管理用于 C++ 开发的库集合

Posted

技术标签:

【中文标题】在 Windows 上管理用于 C++ 开发的库集合【英文标题】:Managing a collection of libraries for C++ development on Windows 【发布时间】:2014-01-05 14:58:19 【问题描述】:

我负责开发一组 C++ 库和程序。目前在 Linux 和 MacOS 上构建,但也需要 Windows 支持。我们将需要支持 VS2010 和 VS2012,未来还会包括 VS2013,可能还会包括 MinGW。我们使用 cmake 进行构建,因此我们的代码应该可以在所有平台上构建而不会出现问题;我的问题是如何管理 Windows 上的所有依赖项,以便能够首先构建,并随着时间的推移使其保持最新。目前,我们每个 Visual Studio 版本都有一个虚拟机作为 jenkins slave,因此所有变体的并行构建相当容易,但管理起来却不是。

问题在于这需要构建的变体数量。如果我们只考虑 VS2010 和 VS2012,带有调试/发布和 i386/x64 构建,那么每个库已经有 8 个副本; 16 如果我们包括其他编译器。我们将需要我们的代码所依赖的所有库,其中至少包括 boost、qt、xerces+xalan、zlib、icu、libpng/tiff/jpeg、hdf5 等,以及 python 及其所有依赖项。随着新的上游版本的发布,我们需要保持整个集合是最新的,并且对于所有构建/架构/编译器变体保持一致。

我不想手动执行此操作,因为这确实需要自动化。但是,我不知道在 Windows 上执行此操作的任何好的解决方案。我在其他项目中看到的 Windows 构建指南通常涉及手动构建所有依赖项,并且只为单个变体构建。在 Linux 上,它已经打包好了,您不需要单独的调试版本,并且可以使用 chroot 来满足 arch 变体;在 MacOS 上,有 homebrew、macports 等,而且在那里实现自动化也相当简单。 Windows有什么等价物吗?我看过巧克力之类的东西,但它完全不适合处理库,而且作为包管理器很差。

对于在 Windows 上进行 C++ 开发的任何人来说,这似乎应该是一个常见问题?是否有任何通用的解决方案、工具或方法来管理一组复杂的库和开发工具?其他开发者如何管理这个?

注意。仅作记录,我们没有使用 Visual Studio 应用程序;我们通过直接使用 cmake 和/或 msbuild 驱动编译器的脚本以非交互方式进行所有构建。

非常感谢, 罗杰

【问题讨论】:

我听说过一个名为 0install 的项目,zero-install.sourceforge.net,但我还没有评估过。 将其交付给外部客户将是一场噩梦。对于内部客户,我们需要企业级编译器版本,因此我们只需更新一个受支持的集合即可进行上游更改。 我以前使用过 Nant build,它非常擅长自动构建相同代码的多个变体。有一个链接here 简要概述了它的用法。或者,也许一个自定义 MSBuild 脚本就足够了(链接 here 给出了示例用法,尽管您可能已经通过它的声音知道如何使用它:) 【参考方案1】:

我参与了提供 X86 发布、x86 调试、x64 发布和 x64 调试的大型 Windows C++ 项目。非常相似,我使用了构建系统,它使用自定义脚本为所有目标平台进行并行构建。

我们在有组织的文件夹中管理所有第三方依赖库。 例如 x86\release\Zlib.dll x86\Debug\zlib.dll x64\release\zlib.dll x64\zlib.dll

自定义脚本从配置管理工具中挑选所有这些库和项目源代码。这允许根据需要自动构建相关的目标二进制文件。

任何第三方库更改都会在配置管理工具中更新,然后被脚本拾取以用于下一次构建。

对于您关于 VS2010 和 2012 支持的问题,我不了解其重要性。一个版本的VS还不够支持项目吗?

【讨论】:

关于VS多版本的支持,这是因为我们提供的是GPL/BSD源码,而不是二进制;最终用户可能希望使用不同的编译器。虽然我们将提供二进制文件,但这主要是我们内部持续集成的输出,而不是直接用于最终用途的东西。在管理所有第三方依赖项时,这是问题的症结所在。当你说你有一个组织和脚本来构建它们时,这正是我正在寻找的。你在这里做什么是定制的,还是有更标准的解决方案?【参考方案2】:

你可以看看http://www.gisinternals.com/sdk/,以及他们的构建系统https://github.com/gisinternals/buildsystem

它基本上是一组相互调用的批处理和制作文件。您仍然需要手动跟踪 lib 更新。

【讨论】:

以上是关于在 Windows 上管理用于 C++ 开发的库集合的主要内容,如果未能解决你的问题,请参考以下文章

vcpkg —— VC++ 打包工具

vcpkg —— VC++ 打包工具

win10 + vs2017 + vcpkg —— VC++ 打包工具

用于在运行时记录调用堆栈的库 (Windows/Linux)

在 C++ 和 Windows 中使用 XmlRpc

在 Linux 上使用纯 C 项目中用 C++ 编写的库?