笔记:C++/C编程学习:使用nuget管理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.mzph.cn/news/646085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保姆级:Palworld幻兽帕鲁32人服务器一键部署

创建幻兽帕鲁服务器1分钟部署教程,阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程,4核16G和4核32G配置可选,阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程: 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…

OpenSSL创建生成CA证书、服务器、客户端证书及密钥

OpenSSL创建生成CA证书、服务器、客户端证书及密钥 证数各参数含义生成CA证书创建root证书私钥创建请求证书创建自签署证书 生成服务器证书创建服务器证书创建服务器请求证书使用CA证书签署服务器证书 生成客户端证书创建客户端证书创建客户端请求证书使用CA证书签署客户端证书…

【模拟通信】AM、FM等的调制解调

调制相关的概念 调制:控制载波的参数,使载波参数随调制信号的规律变化 已调信号:受调载波,含有调制信号的全部特征 调制的作用: 提高发射效率多路复用,提高信道利用率提高系统抗干扰能力 两种调制方式 线性调制&a…

​第20课 在Android Native开发中加入新的C++类

​这节课我们开始利用ffmpeg和opencv在Android环境下来实现一个rtmp播放器,与第2课在PC端实现播放器的思路类似,只不过在处理音视频显示和播放的细节略有不同。 1.压缩备份上节课工程文件夹并修改工程文件夹为demo20,将demo20导入到Eclipse或…

搭建k8s集群实战(二)安装keepalived和haproxy

keepalived介绍: 是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障 Keepalived作用: 为haproxy提供vip(10.208.1.190)在三个haproxy实例之间提供主备,降低当其中一个haproxy失效的时对服务的影响。 1、yum安装Keepalived【三个master…

RBD —— 简介

目录 General workflow Tips RBD SOP inputs and outputs Clustering Importing a fractured object into DOPs RBD SOP support nodes Related SOPs Low-level SOPs 通常在刚体模拟中,希望实体对象会因某些碰撞或力而破碎;Houdini内大多数破碎…

C# Bitmap类学习1

Bitmap对象封装了GDI中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using …

教你如何低成本自建「幻兽帕鲁」服务器,快速一键部署

创建幻兽帕鲁服务器1分钟部署教程,阿里云和腾讯云均推出幻兽帕鲁服务器服务器和部署教程,4核16G和4核32G配置可选,阿腾云atengyun.com分享1分钟自建幻兽帕鲁Palworld服务器教程: 幻兽帕鲁服务器创建教程 幻兽帕鲁服务器官方推荐…

EF core连接数据库的前期完整配置流程-开发环境搭建

EF core连接数据库完整流程-开发环境搭建 前置:.net6 core webapi不勾选任何配置 声明:这里是以两个配置类来做的,一个T_Books表,一个T_Person表 Book:创建属性及类型 BookConfig:对创建的进行属性数据表…

66.Spring是如何整合MyBatis将Mapper接口注册为Bean的原理?

原理 首先MyBatis的Mapper接口核心是JDK动态代理 Spring会排除接口,无法注册到IOC容器中 MyBatis 实现了BeanDefinitionRegistryPostProcessor 可以动态注册BeanDefinition 需要自定义扫描器(继承Spring内部扫描器ClassPathBeanDefinitionScanner ) 重…

物业app开发实战:10大功能必备,打造智能社区生活

随着智能科技的快速发展,物业管理也逐渐迈入数字化时代。物业app开发成为了提升社区管理效率、改善居民生活质量的重要途径。在本文中,我将分享10大必备功能,帮助开发者打造智能社区生活的物业app。 1. 便捷的社区公告发布功能 通过物业app…

R语言VRPM包绘制多种模型的彩色列线图

列线图,又称诺莫图(Nomogram),它是建立在回归分析的基础上,使用多个临床指标或者生物属性,然后采用带有分数高低的线段,从而达到设置的目的:基于多个变量的值预测一定的临床结局或者…

免费畅享,打破写作瓶颈:星火写作助手覆盖全面,助你轻松创作

啰嗦几句 最近年终岁末,公司的各种文案各种总结,写得人是头晕脑胀,所以好多小伙伴最近在求智能写作的软件,最好是ChatGPT。 ChatGPT是国外产品,在国内并不能访问。而就智能写作来说,我们何必舍近求远呢&am…

1.新建项目

愿你出走半生,归来仍是少年! 环境:.NET 7、MAUI 1.新建项目 打开VS2022,点击“创建新项目”。 新建项目 2.选择项目类型 在搜索框输入“Maui”,选择“NET MAUI应用”,配置项目名称、保存地址等,并选择框架版本。 项目…

精准监测,守护城市脉搏:管网压力、流量监测设备

在繁忙的城市中,每一个管道都如同城市的血脉,承载着重要的使命。为了确保城市的正常运行,我们提供精准的管网压力、流量监测设备,用科技守护城市的脉搏。 我们的设备采用最新的技术,可以实时监测管网的压力和流量&…

Spring Cloud Validation 使用正则表达式校验

----不支持中文的例子 Schema(description "商品名称") Pattern(regexp "^[^\u4E00-\u9FA5]*$", message "商品名称不支持中文") Size(max64,message"商品名称最大支持64个字符") private String goodsName; --支持 中英文和数…

【11.PWM捕获】蓝桥杯嵌入式一周拿奖速成系列

系列文章目录 蓝桥杯嵌入式系列文章目录(更多此系列文章可见) PWM捕获 系列文章目录一、STM32CUBEMX配置二、项目代码1.mian.c --> HAL_TIM_IC_CatureCallback 总结 一、STM32CUBEMX配置 STM32CUBEMX PA15 ->TIM2_CH1; PB4-> TIM3_CH1 预分频设置为79,自动重装载设置…

HTML实战

HTML实战 标题 标题排版 img标签路径书写的两种方式: 绝对路径 绝对磁盘路径:C:\User…绝对网络路径:https://i2.sinaimg.cn/dy/deco/2012/0613/yocc20120613img01/news_logo.png 相对路径 ./ : 当前目录 ../ : 上一级目录宽…

Spring基于dynamic-datasource实现MySQL多数据源

目录 多数据源实现 引入依赖 yml配置文件 业务代码 案例演示 多数据源实现 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>dynamicdatasourcespringbootstarter</artifactId><version>3.5.0</version> &…

Programming Abstractions in C阅读笔记:p248-p253

《Programming Abstractions in C》学习第69天&#xff0c;p248-p253总结&#xff0c;总计6页。 一、技术总结 “A generalized program for two-player games”如标题所示&#xff0c;该小节强调要学会从一个复杂的程序中抽象出通用的内容——这也是本书的主旨——“Program…