具有第三方依赖性的C ++开发流程

时间:2015-10-04 13:42:08

标签: c++ visual-studio qt boost cmake

我是一名Python开发人员,有一些其他语言的背景知识,比如Ruby。 在这两种语言中,依赖关系由包管理器自动管理,例如pipgem。任何人都可以通过调用pip install -r requirements.txt 安装此类依赖关系,并通过Python Package Index安装必要的依赖关系。虽然,有一个选项可以从源手动构建依赖项并安装到项目中,但它不是推荐的过程,我还没有这样做。

我注意到,不幸的是,C ++在如何解析some reason.的依赖关系方面具有不同的性质(例如,不同的编译器风格,编译器参数,平台等......)

目前,我正在使用VS2015学习C ++。我一次又一次地发现这些库依赖关系很重要。对于VS2015,有一个像python这样的依赖包管理器,它是 NuGet 。然而,并非每个库都可以在NuGet中使用,事实上,有很多库是独立于其IDE而开发的。

首先,我尝试使用Boost。有关如何构建项目的手册,但我不确定我需要什么。我需要从源代码构建吗?或许我只需要一个随时可用的图书馆?

我找到的另一个图书馆的原因相同。 (例如QT,yaml-cpp,googletest等。)他们只有一个文档如何构建,而不是如何作为依赖安装。

最终,我需要使用大量第三方库来提高工作效率。所以,这里有一些非常相关的问题。

  1. C ++开发人员通常如何将第三方库纳入他们的项目(安装第三方库的流程)?
  2. 每次我想要包含时,我是否必须从源代码构建?或者你可能只需要你可以复制并粘贴到项目目录中的头文件?
  3. 我在团队工作(git),我的每个团队都需要手动构建依赖项吗?它可以自动化,使包含新库的过程对每个人都是透明的吗?
  4.   或许,或许,我真的不明白我需要什么具体问题   问。但是为什么在C ++中重用库是如此痛苦呢?

    我是否会错过对C ++ environement的一些基本理解?

    我不确定它有多大相关性,但CMake是大多数库用来构建项目的构建工具。我真的需要构建这些库项目吗?

    更多问题:

    1. 构建一些库后,其中一些库会生成静态库.lib或动态库.dll以包含在项目中。那么在我们的项目中复制这些生成的库是否正确?这应该提交到源版本控制吗?有些图书馆非常庞大,我们不想维护它。然而,我们需要整个团队透明地获取图书馆。

2 个答案:

答案 0 :(得分:3)

我很了解你的情况。你无法看到森林,因为有太多的树木挡在你的路上......

在我开始解决您的具体问题之前,让我先澄清一点:

  

一般来说,C ++中的依赖性比Python更复杂。

命令pip install -r requirements.txt将建立Internet连接并从存储库服务器下载必要的库和文件以满足要求。在Linux操作系统(Ubuntu)下,命令:sudo apt-get install libboost-all-dev安装所有必需的boost依赖项。这是可能的,因为整个环境中的服务器包含源代码以及与使用它的客户端程序(apt-get)一起工作的库和二进制文件。这与pip的作者为微软窗口所做的完全相同。微软本身从未在操作系统层面做过这件事。他们总是将留给程序员 NuGet 是微软试图弥补过去的错误。

让我解决这个问题,让我来解答你的问题:

  1. 这取决于第三方库的大小。像pugixml这样的小型库可以作为源包含在项目的源代码树中。像boost这样的更大的库更好地包含在二进制对象代码(库对象)中。并非所有库都有可供下载的二进制文件(boost has),因此您可能需要从源代码构建。请记住,所有二进制文件都需要与您在项目中使用的完全相同的编译器构建。将其包含在VS-Project中的一般步骤:

    1. 获取分发文件(从源代码构建或下载并安装二进制文件)
    2. 为项目添加包含路径:
        

      项目> “projectname”属性>配置属性> C / C ++>一般>其他包含目录

    3. 添加库的路径:
        

      项目> “projectname”属性>配置属性>链接器>输入>附加依赖。

  2. 没有。您通常只使用头文件。但是最好将库的路径添加到项目中而不是复制头文件,因为一些项目(boost)具有巨大的头文件层次结构。

  3. 您的团队中的每个成员都具有相同的开发环境并且安装了相同的库集,这是一个好主意。有这个任务的工具:Chocolatey建立在NuGet之上,因此是windows-affine。 Vagrant处理虚拟盒子因此提供跨平台开发环境。

    但更重要的是一个体面的source-control-management系统。如果你还没有使用过一个 - 开始使用一个今天!。这是主要的协作工具。如果松开显影机,它可以真正保存你的脖子。

  4. 存在另一个依赖性问题:我们只讨论了上面的开发依赖项。存在部署依赖性问题:

    • 您的客户将需要您用于开发的库(* .dll文件)。您还需要将它们打包到部署包(Installer)中。这是另一个问题,可能已在SO上得到解答。

    Qt:如果您开始使用Qt,我建议您开始使用他们的开发环境Qt-Creator。这将自动处理所有依赖项。它将自动检测您已安装的Visual Studio编译器并使用它。 IDE非常接近Visual Studio。

    CMake:不,并不总是需要使用CMake来构建库项目,有些还包括Makefile。其他人使用CMake来制作Makefile。 “按照说明”是我在这里给出的最佳建议。

    更新2015-10-24:第三点重写

答案 1 :(得分:0)

  

C ++开发人员通常如何将第三方库纳入其中   项目(安装第三方库的流程)?

这取决于......有很多方法,如何重新分发C ++库。

  

每次我想要包含时,我是否必须从源代码构建?也许   你只需要你可以复制和粘贴的头文件   你的项目目录?

目前,大多数C ++库包含两部分:二进制文件+头文件。但是,如果编译器版本的库与编译器不同,那么通常存在很多问题。

  

我在团队中工作,我的每个团队都需要建立依赖关系   手动?它可以自动化,包括新的过程   图书馆对每个人都是透明的吗?

它取决于您的团队指导方针。你可以选择你想要的东西。

  或许,或许,我真的不明白我需要什么具体问题   问。但是为什么在C ++中重用库是如此痛苦呢?

由于C的一些遗留问题而且因为与python / java / c#相比,C ++是低级语言。许多不同的平台都支持C ++,包括嵌入式。而且,在这个平台上安装复杂的运行时是不可能的。因此,没有机制可以在运行时透明地链接“模块”。

希望C ++ 17标准中的模块能够得到正常的支持。 Microsoft将在MSVC 2015 update 1中提供C ++模块的技术预览。

  

我是否会错过对C ++ environement的一些基本理解?

是的,我建议您阅读C / C ++中的编译链接。这两件事经常在一起,但它们是不同的。

首先,您应该注意:C / C ++中的代码分为两部分:声明(.h文件)和实现(.cpp文件)。 .CPP文件被编译为二进制文件。 .H文件只是声明了一个接口。