具有 3rd 方依赖性的 C++ 开发流程

标签 c++ visual-studio qt boost cmake

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

6年前关闭。




Improve this question




我是一名 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 等。)他们只有一个文档如何构建,而不是如何安装为依赖项。

最终,我将需要使用大量的 3rd 方库来 boost 工作效率。所以,这是我的一些非常相关的问题。

  • C++ 开发者通常如何将 3rd 方库包含到他们的项目中(安装 3rd 方库的流程)?
  • 每次我想包含时都必须从源代码构建吗?或者您可能只需要可以将其复制并粘贴到项目目录中的头文件?
  • 我在团队 (git) 中工作,我的每个团队都需要手动构建依赖项吗?是否可以自动化,以便包含新库的过程对每个人都是透明的?

  • Or perhaps, I don't really understand what specific question do I need to ask. But why it is so painful to reuse library in C++?



    我是否错过了对 C++ 环境的一些基本理解?

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

    更多问题:
  • 构建一些库后,其中一些生成静态库.lib或动态库.dll被纳入项目。那么在我们的项目中复制这些生成的库是否正确呢?这应该提交到源版本控制中吗?有些库非常大,我们不想维护它。然而,我们需要整个团队透明地获取库。
  • 最佳答案

    我很了解你的情况。你看不到森林,因为太多的树挡住了你的路......

    在我开始解决您的具体问题之前,让我弄清楚一件事:

    Generally speaking, dependencies in C++ are not more complicated than in Python.



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

    有了这个,让我来解决你的问题:
  • 这取决于第 3 方库的大小。像 pugixml 这样的小型库可以作为源代码包含在项目的源代码树中。像 boost 这样的更大的库最好作为二进制对象代码(库对象)包含在内。并非所有库都有可供下载的二进制文件 ( boost has ),因此您可能需要从源代码构建。请记住,所有二进制文件都需要构建 使用完全相同的编译器 你在你的项目中使用的。将它包含在你的 VS-Project 中的一般步骤:
  • 获取分发文件(从源代码构建或下载并安装二进制文件)
  • 将包含路径添加到您的项目:

    Project > "projectname" properties > Configuration Properties > C/C++ > General > Additional Include Directories

  • 添加库路径:

    Project > "projectname" properties > Configuration Properties > Linker > Input > Additional Dependencies.

  • 不。您通常只使用头文件。但是最好将库的路径添加到您的项目中,而不是复制头文件,因为某些项目(boost)具有巨大的头文件层次结构。
  • 最好让团队中的每个成员都拥有相同的开发环境并安装相同的库集。有用于此任务的工具:Chocolatey建立在 NuGet 之上,因此是 windows 仿射的。 Vagrant处理虚拟盒子,从而提供跨平台的开发环境。

    但更重要的是体面的source-control-management系统。如果您还没有使用一个 - 开始使用一个 今天! .这是主要的协作工具。如果您丢失了开发机器,它真的可以节省您的脖子。

  • 还有一个依赖问题:我们只解决了上面的开发依赖项。存在的问题部署依赖项:
  • 您的客户将需要您用于开发的库(*.dll 文件)。您还需要将它们打包到您的部署包(安装程序)中。这是另一个问题,可能已经在 SO 上得到了回答。

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

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

    2015-10-24 更新:第三段重做

    关于具有 3rd 方依赖性的 C++ 开发流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32934134/

    相关文章:

    c# - 使用字符串的 Console.writeline

    qt - QT套接字等待用户输入

    python - QTableWidget 选择多个单元格永久与 Ctrl + MouseClick 相同

    c++ - Qt 和 auto_ptr

    c++ - LLVM IR 中 '&&' 的指令是什么?

    c++ - 使用模板化可变模板参数作为专用参数

    c++ - 窗口上 C/C++ 的自动记录器

    c++ - 关于最令人烦恼的解析的一个令人困惑的细节

    sql-server - Foreach 循环编辑器中缺少枚举器

    android - Xamarin Android 链接无法访问文件