具有第三方依赖性的c++开发流程
C++ Development Flow with 3rd Party Dependency
我是一名Python开发人员,具有Ruby等其他语言的背景。在这两种语言中,依赖都是由包管理器自动管理的,比如pip
或gem
。任何人都可以通过调用pip install -r requirements.txt
来安装这样的依赖项,它将通过Python包索引安装必要的依赖项。虽然,有一个选项可以从源代码手动构建依赖并安装到项目中,但这不是一个推荐的过程,我也没有这样做。
我注意到由于某些原因,c++在如何解决依赖关系方面不幸具有不同的性质。(例如,不同的编译器风格、编译器参数、平台等)
目前,我正在使用VS2015学习c++。我一次又一次被这些图书馆依赖问题绊倒。在VS2015中,有一个像python一样的依赖包管理器,它是NuGet。然而,并不是每个库都可以在NuGet中使用,事实上,有很多库是独立于其IDE开发的。
首先,我试图使用Boost。有一个关于如何构建项目的手册,但我不确定我需要什么。我需要从源代码构建吗?或者我只是需要一个现成的图书馆?
我找到的另一个库也是同样的原因。(如QT、yaml-cpp、googletest等)它们只有一个如何构建的文档,而不是如何安装作为依赖项。
最终,我将需要使用大量的第三方库来提高生产力。所以,这是我的一些非常相关的问题。
- c++开发者通常如何将第三方库包含到他们的项目中(安装第三方库的流程)?
- 我必须从源代码构建每次我想包含吗?或者也许你只需要头文件,你可以复制粘贴到你的项目目录?
- 我在团队(git)中工作,我的每个团队都需要手动构建依赖关系吗?它是否可以自动化,这样包含新库的过程对每个人都是透明的?
或者,我真的不明白我需要什么具体的问题问。但是为什么在c++中重用库是如此痛苦呢?
我是否错过了对c++环境的一些基本理解?
我不确定它有多大的相关性,但CMake作为一个构建工具,大多数图书馆使用来构建他们的项目。我真的需要建立这些图书馆项目吗?
更多问题:
- 在构建了一些库之后,其中一些库会生成静态库
.lib
或动态库.dll
,并包含在项目中。那么在我们的项目中复制这些生成的库是正确的吗?这应该提交到源代码版本控制吗?有些库非常大,我们不想维护它。但是我们需要整个团队透明地获取库。
我很了解你的情况。你看不到森林,因为太多的树挡住了你的去路。
在我开始回答你的具体问题之前,让我先弄清楚一件事:
一般来说,c++中的依赖项并不比Python中的复杂。
命令pip install -r requirements.txt
将建立互联网连接,并从存储库服务器下载必要的库和文件以满足要求。在Linux操作系统(Ubuntu)下,命令:sudo apt-get install libboost-all-dev
安装boost所需的所有依赖项。这是可能的,因为有一个完整的服务器环境,其中包含源代码以及与使用它的客户机程序(apt-get
)一起工作的库和二进制文件。这与pip
的作者为microsoft windows所做的完全相同。微软自己从来没有在操作系统级别这样做过。他们总是把留给程序员。NuGet是微软试图弥补过去的错误。
有了这些,让我来回答你的问题:
-
这取决于第三方库的大小。像pugixml这样的小库可以作为源代码包含在项目的源代码树中。较大的库,如boost,最好作为二进制对象代码(库对象)包含。并不是所有的库都有可供下载的二进制文件(boost有),所以您可能需要从源代码构建。请记住,所有二进制文件都需要使用与您在项目中使用的完全相同的编译器来构建。在VS-Project中包含它的一般步骤:
- 获取发行版文件(从源代码构建或下载并安装二进制文件)
- 添加包含路径到你的项目:
Project> "projectname" properties> Configuration properties> C/c++> General> Additional Include Directories
- 为库添加路径:
Project> "projectname" properties> Configuration properties> link> Input> Additional Dependencies.
-
。通常只使用头文件。但是最好将库的路径添加到项目中,而不是复制头文件,因为一些项目(boost)有一个巨大的头文件层次结构。
-
团队的每个成员都有相同的开发环境,安装了相同的库集,这是一个好主意。有一些工具可以完成这项任务:Chocolatey构建在NuGet之上,因此是窗口仿射的。Vagrant处理虚拟盒子,因此提供跨平台的开发环境。
但更重要的是一个体面的源代码控制管理系统。如果你还没有使用一个,现在就开始使用一个。这是主要的协作工具。
还有另一个依赖问题:我们只处理了上面的开发依赖。存在部署依赖项的问题:
- 您的客户将需要您用于开发的库(*.dll文件)。您还需要将它们打包到部署包(Installer)中。这是另一个问题,可能已经回答了SO。
Qt:如果你开始使用Qt,我建议你开始使用他们的开发环境Qt- creator。这将自动处理所有依赖项。它将自动检测您已安装的Visual Studio编译器,并使用它。IDE非常接近Visual Studio。
CMake:不,并不总是需要使用CMake来构建库项目,有些还包括Makefiles。其他人使用CMake来生成makefile。"按照说明去做"是我能给出的最好的建议。
更新2015-10-24:段落三重做
c++开发人员通常如何将第三方库包含到他们的项目(安装第三方库的流程)?
这取决于……有很多方法,如何重新分发c++库。
目前,大多数c++库包含两个部分:二进制文件和头文件。但是,如果库的编译器版本与您的编译器不同,通常会出现很多问题。每次我想包含时都必须从源代码构建吗?或者你只需要头文件,你可以复制粘贴到你的项目目录?
我在团队中工作,我的每个团队都需要构建依赖吗手动吗?它能自动化这样包含新内容的过程吗图书馆对每个人都是透明的?
这取决于你的团队指导方针。你可以选择你想要的。
或者,我真的不明白我需要什么具体的问题问。但是为什么在c++中重用库是如此痛苦呢?
因为C的一些遗留问题,而且因为与python/java/c#相比,c++是一种低级语言。很多不同的平台都支持c++,包括嵌入式平台。通常,在这些平台上安装复杂的运行时是不可能的。因此,没有机制可以透明地在运行时链接"模块"。
希望c++ 17标准中会有对模块的正常支持。微软将在MSVC 2015更新1中提供c++模块的技术预览。
我是否错过了对c++环境的一些基本理解?
是的,我建议你在C/c++中阅读编译和链接。这两件事经常同时出现,但它们是不同的。
首先,你应该注意:C/c++中的代码分为两部分:声明(.h文件)和实现(.cpp文件). .cpp文件被编译成二进制文件,.h文件只是声明一个接口。
- 如何用RISC-V GD32VF103CBT6开发板卸载精确的ADC过采样
- 我正在开发服务器,ip作为参数传递不起作用
- 如何使用 GPS 和指南针开发点移动算法
- AWS IoT 开发工具包:通过 TCP 端口 443 使用 MQTT
- 使用AAR的虚幻安卓开发
- 为什么开发人员将C / C ++用于嵌入式系统,而不是像Python这样的高级语言与C相比?
- 开发C++/地图中的控制台角色扮演游戏
- 测试驱动开发 c++:如何将对象添加到向量中,将歌曲添加到播放列表并对其进行测试
- 使用 AWS C++ 开发工具包分段上传 S3
- 如何在可视化代码中生成用于 c++ 开发的调试器?
- 与 AWS 开发工具包的链接问题
- CMake 工具链文件:嵌入式开发的适当值"CMAKE_SYSTEM_PROCESSOR"
- 错误:#include 在开发C++中嵌套得太深
- 使用代码在 AWS 开发工具包C++控制台应用程序上设置凭证
- 可视化配置 VS 代码以进行 C++ 编程和开发
- GCP 或 AWS 是否支持 C++ 和 GUI 应用程序开发?
- C++如何告诉开发人员在设计模板(如Java接口)时实现某事
- 在没有Xcode的macOS中开发具有依赖关系的应用程序
- 仅在标头开发中转发声明
- 如何使用 AWS C++ 开发工具包在给定的开始和结束日期范围内列出 S3 中的文件