笔记:C++/C编程学习:使用nuget管理c++库的原理

news/2024/7/8 4:15:30 标签: 笔记, c++, c语言

如果要做一个应用程序,我们往往会用到很多第三方库,这时库包管理工具就很重要,如js/npm,c#/nuget,php/composer,jave/maven之类,但vc++一直没一个很舒服的包管理工具。很多c++第三方库对vc++都非常不友好,谁能轻而易举地在vc++上编译一个openssl呢?

nuget出现试图解决这个问题,但出现更大的问题就是直接下载二进制文件,太大,下载了一个vs2012的又不支持vs2013,版本之间很难共用,想去调一下配置又不可能(因为下载的是二进制文件)。我还记得曾经为编译一个boost看配置、折腾半天。举个例子,我为mysql做了一个vcpkg包,更是折腾。而这时vcpkg就诞生了,解决了上述所有的问题,比如装一个mysql客户端,你只需要:

vcpkg install libmysql

使用nuget管理c++库的原理

简介

通常使用c++库需要在项目配置里设置头文件包含路径和lib的链接路径。所以不同于c#库直接将文件放在指定位置就可以使用。
nuget指定了一系列的特殊目录,用来管理包的内容,但是并不能管理c++库,nuget自从2.5后开始支持管理c++库。为此特意规定了一个build目录,build目录中可以通过使用msbuild脚本来达到自动配置路径的效果,从而可以使用c++库。

原理

目录结构
nuget包下的build目录中按照平台来划分子目录,但是c++库统一设为native平台,所以只有一个native目录。native下面有一系列的目录,存放着库的文件,例如头文件、lib文件、dll之类的。并且根据配置不同,会分别存放多个版本(Debug、Release、x86,x64之类)的文件。
通常目录结构是这样的

xxx.1.0.nupkg
 └─xx.1.0.nuspec
 └─build
    └─native
        ├─bin
        │  └─Win32
        │      └─v120
        │          └─dynamic
        │              ├─Debug
        │              │  └─xx_d.dll
        │              └─Release
        │                  └─xx_d.dll    
        ├─include
        │   └─xx.h
        └─lib
        │   └─Win32
        │      └─v120
        │           └─dynamic
        │               ├─Debug
        │               │  └─xx_d.lib
        │               └─Release
        │               └─xx_d.lib
        └─xx.targets                    

脚本
nuget管理器使用包的时候会寻找native下面和包名一样的.targets文件。并把他包含到项目的工程文件(.vcxproj)中
.targets文件是一个msbuild脚本,通常里面会自动设置头文件包含路径和链接路径、并且设置对应版本的链接库,最后将对应版本的dll自动复制到生成目录里面。

打包
然后填写好.nuspec文件中的描述信息后就可以使用nuget命令打包,然后发布后就像正常的nuget包一样使用。使用nuget包来引用c++库后不需要再做任何额外的设置,只需要安装nuget包就可。

coApp
虽然看起来制作一个c++库的nuget包很简单,但是编写一个合格的targets文件仍然是一件极其复杂的事。所以通常我们使用一个开源的powershell工具coApp(http://coapp.org/)来帮助我们自动完成这一切。


http://www.niftyadmin.cn/n/5339501.html

相关文章

在vue中如何优雅的封装第三方组件

在使用第三方组件的时候或多或少的会因为样式,业务不符合自己的需求进而进行封装。是否你也会有这样的困扰。封装业务组件的时候,弄了好多业务进自己的组件里。要传递好多参数给自己封装的组件,然后再在封装的组件里传递给第三方组件。不禁要…

【AI知识片段】Transformer模型中的位置编码

1.什么是位置编码 位置编码描述序列中实体的位置或位置,以便为每个位置分配唯一的表示形式。单个数字(如索引值)不用于表示项目在转换器模型中的位置的原因有很多。对于长序列,索引的量级可能会变大。如果将索引值归一化为介于 0 …

双通道5V高细分步进电机——GC6129,可替代MS41929,具有低噪声、低振动的特点

GC6129是双通道5V低电压步进电机驱动器,具有低噪声、低振动的特点,特别适用于相机的变焦和对焦系统,万向节和其他精密,低噪声STM控制系统。该芯片为每个通道集成了256微步驱动器带SPI接口,用户可以方便地调整驱动器的参…

【 CSS 】基础 2

“生活就像骑自行车,想要保持平衡,就得不断前行。” - 阿尔伯特爱因斯坦 CSS 基础 2 1. emmet 语法 1.1 简介 Emmet语法的前身是 Zen coding,它使用缩写,来提高 HTML / CSS 的编写速度, VSCode 内部已经集成该语法。…

本地仓库如何与远程仓库进行关联

目录 设置Git 全局设置: 创建一个远程仓库 创建本地仓库 连接远程仓库 查看远程仓库origin的关联信息 查看所有远程仓库 切换远程仓库 设置Git 全局设置: git config --global user.name "your name" git config --global user.email "your email163.co…

使用Docker本地部署Jupyter Notebook并结合内网穿透实现远程访问

文章目录 1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook,并结合cpolar内网穿透…

uniapp页面跳转的几种方式 以及举例(2)

又来混时长 嫖流量卷了 一,uni.navigateTo(OBJECT) 保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。 // 1.不传参 uni.navigateTo({url:./home/index }); // 2.传参字符串 uni.navigateTo({url:./home/index?title${tit…

Spring-简介

在向读者描述Spring时,笔者不打算从某处粘贴一段常见的概念性文字糊弄完本专栏的第一篇文章,而是用易于理解的话向读者指出几个重点。 (1)是框架。何谓框架?就像搭房子一样,框架就如同是墙体结构&#xff…