草庐IT

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

coder 2024-02-22 原文

关闭。这个问题需要更多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/

    有关具有 3rd 方依赖性的 C++ 开发流程的更多相关文章

    1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

      我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

    2. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

      我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

    3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

      我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

    4. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

      我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

    5. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

      我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

    6. Ruby Sinatra 配置用于生产和开发 - 2

      我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

    7. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

      我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

    8. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

      这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

    9. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

      我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

    10. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

      我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

    随机推荐