问题 C ++如何管理依赖项(例如,使用来自github的库)


我对C ++世界很陌生,所以请对不起我这样一个虚假的问题。我谷歌一点,但无法找到正确的答案。

我的问题很简单 - 我应该如何在C ++世界中使用lib。例如在Java中 - 有 maven 和 gradle 为了这个任务。在Python中 - 我使用 pip。在javascript中 npm 和 bower 做所有的事情。在C#中你使用 nuget 或者只是将DLL lib添加到您的项目中。但在C ++中看起来并不是那么容易。

我找到了一个名为的工具 conan 但是他们拥有的库很少,而且不包括任何我想要的东西。

所以,例如 - 我想使用nlp lib meta。似乎他们没有提供任何安装程序文件。所以我假设我需要从github获取源代码。我应该编译它们然后尝试将编译的文件添加到我的项目中,或者我需要 lib 在我的项目中的文件夹,并把 meta's 这些文件夹中的源和操作后 meta's 他们在我的项目中的来源?


我的问题不是如何安装具体的 meta lib,但更多来自源代码管理的观点。如果我使用 Visual Studio 上 Windows 例如,但我的colegue将编码 Clion 下 Linux。我不想知道哪种是在C ++世界中管理依赖关系的正确方法。


2500
2017-09-26 14:12


起源

您链接的库似乎有一个相当广泛的设置指南,适用于各种平台。你试过那个吗? - Baum mit Augen
是的,但他们的指南主要是使用lib作为独立工具,但我需要在代码中引用它,所以我的问题不是关于如何安装特定的lib,而是如何处理项目中源管理的libs 。 - silent_coder
C ++社区通常缺少一个无处不在的包管理器,除非你可以在你找到的那些管理器中找到该库,你下载代码并自己构建它。 - Niall
你的构建环境是什么?你试过什么了? - wasthishelpful


答案:


Cget 将安装任何使用标准cmake的包,适用于linux和windows。它缩短了直接从github获取包的语法(例如 cget install google/googletest)。

此外,还可以通过将依赖项列在其中来自动下载依赖项 requirements.txt 文件。

还有用于安装非cmake包和存储库的配方 这里 有超过300个图书馆(并且不断增长)。所以你可以安装curl cget install pfultz2/cget-recipes curl


4
2017-09-26 14:48





C ++遗憾地没有库的包管理器。有些人在那里,并尝试成为一个虽然仍然很小和分散(如柯南)。

在linux中,你可以安装一些“-dev”软件包,但它们也不是“全部”。

你最有可能最终自己下载它们。接下来是你有集成这些库的问题。每个操作系统都有不同的构建系统,因此您必须了解如何构建c ++文件。

就像在使用Visual Studio的Windows中一样,您必须获得可视工作室项目或与nmake兼容的makefile来构建库,然后将它们添加到您的项目中。与linux makefiles相同。

有几个更高级别的构建框架 cmake。您在帖子中的示例也适用于CMake。因此将这一个集成到cmake构建环境会更容易,但这仅适用于其他库也尝试使用/集成cmake构建环境(例如boost / qt正在执行此操作)。

是的,这些是对此的一些想法。遗憾的是,没有一个简单/明确的答案,因为没有真正的中央c ++数据包存储库也集成到构建系统中。


3
2017-09-26 14:27





C ++没有类似的东西 pip 要么 npm/bower。我不知道是否 maven 要么 gradle 可以说服它来处理C ++库。

一般来说,你将不得不最终得到

  • 某个目录中的头文件
  • 库文件(静态库或DLL /共享对象)。如果库是一个只有头文件库,就像某些boost库一样,那么你就不需要了。

您可以通过在计算机上构建库文件(通常用于开源项目,以及针对Linux平台的项目),或通过下载预编译的二进制文件(典型的Windows库,特别是付费文件)来获取库文件。

希望建立图书馆的说明将包含在图书馆网站上。正如评论中所指出的,'meta'似乎相当擅长。

当您尝试使用库进行编译时,可能需要命令行选项(例如, -I)指定包含头文件的目录,您可能需要一个链接器选项(例如 -l)告诉链接器链接到您的库。


3
2017-09-26 14:24





在我看来, Crascit / DownloadProject 在你的情况下可能会有所帮助。它提供 CMake 通过指定从git存储库下载项目的插件 tags等等然后你可以使用 add_custom_target 要运行命令,您需要构建项目。


2
2018-03-15 07:21





有很多流行的C ++发布 nuget包。 您可以在图库中搜索它们,通常使用 native 要么 c++ 标签。显然你需要一个nuget管理器用于你的操作系统,我很确定C ++ nuget包依赖于MSBuild来完成很多繁重的工作,所以你可能很难让非面向Visual Studio的设置工作得很好。

Gradle实际上确实有一些支持 原生依赖 同样。我刚才看过一段时间,但由于缺乏对VS 2015的支持,因此对它的工作进行了限制。


0
2017-09-26 14:36