使用CoApp创建NuGet C++静态库包
NuGet是微软开发平台下的包管理软件,使用它你可以非常方便的将一些第三方的库、框架整合进自己的项目中,省去了不少麻烦的配置过程。但是从官方文档上来看,貌似NuGet对C++的支持不是很好,并且在现阶段推荐使用CoApp来简化包的构建。
1. 环境要求
- NuGet 2.5 及以上(较新版本才加入了对C++包的支持)
- Windows Vista及以上,PowerShell 3.0(CoApp使用PS来构建C++本地包)
- CoApp(简化包的构建过程,安装详见官网)
2. 准备材料
- 静态库及相应发布的头文件
- 静态库符号数据库(即PDB文件)
- 文档(可选)
3. 编写AutoPackage脚本
这个脚本是用来指导CoApp构建我们的静态库包的,一般使用.autopkg
作为其扩展名。 该文件由多个节点(Node)组成,节点的写法相当于C++中的命名空间。
3.1 nuget节点
这是脚本的父节点,它包含所有用来生成NuGet包的子节点。
nuget{
}
3.2 nuspec子节点
该节点包含要创建包的元数据,我们在这里指定将要生成的包的描述信息,这些信息会被显示在NuGet官网中的包页面下。常用的主要有:
- ID
- 版本(version)
- 标题(title)
- 作者(authors)
- 所有者(owners)
- 许可文件地址(licenseUrl)
- 项目地址(projectUrl)
- 图标地址(iconUrl)
- 概要(summary)
- 描述(description)
- 标签(tags)
这个节点是nuget的子节点,元数据的具体写法如下(注意每一项元数据后面都要跟一个分号;
):
nuspec
{
id = EasyXPlus;
version : 1.0.1;
title: EasyXPlus;
authors: lgxZJ@outlook.com;
projectUrl: "https://github.com/lgxZJ/EasyXPlus";
summary:A simple C++ graphic library for BEGINNERS under windows!;
description: "A simple C++ graphic library for BEGINNERS under windows!";
tags: { beta, native, c++ };
}
3.3 files子节点
files节点也是nuget的子节点,用来指定生成包所需要的文件。对于C++静态库来说,我们只需要在files节点中指定三种文件:
1.头文件: include : { "headers\*" };
我们指定相对目录headers下的所有文件为发布的头文件。
2.文档(可选):docs : { "doc\html\* };
我们指定相对目录doc\html下的所有文件为文档。
3.库文件、PDB文件:对于这些文件我们需要指定目标平台、VS版本和开发模式:
[x86, v140, debug] {
lib: builds\vs2015\libeasy\Debug\libeasyd.lib;
symbols: builds\vs2015\libeasy\Debug\libeasy.pdb;
}
[x64, v140, release] {
...
}
这个数据项格式不同于其他简单的项,不需要在末尾跟分号;
。
下面是一些VS版本号与对应工具集:
- VS2015 ---- v140
- VS2013 ---- v120
- VS2012 ---- v110
- VS2010 ---- v100
3.4 targets子节点
我们没有用到这个节点,因此简单的在Defines定义中加上一个值:
targets
{
Defines += HAS_EASYXPLUS;
}
至此,我们的脚本就编写结束了,完整的文件见链接。
4. VS2015发布支持
但是CoApp还没有正式的版本支持VS2015,因此我们采用了github上一个workaround,这个节点需要写在nuget
节点之前:
configurations {
Toolset {
key : "PlatformToolset";
choices: { v140 };
// Explicitly Not including pivot variants: "WindowsKernelModeDriver8.0", "WindowsApplicationForDrivers8.0", "WindowsUserModeDriver8.0"
// We're normalizing out the concept of the v140 platform -- Overloading the $(PlatformToolset) variable for additional pivots was a dumb idea.
v140.condition = "( $(PlatformToolset.ToLower().IndexOf('v140')) > -1 Or '$(PlatformToolset.ToLower())' == 'windowskernelmodedriver8.0' Or '$(PlatformToolset.ToLower())' == 'windowsapplicationfordrivers8.0' Or '$(PlatformToolset.ToLower())' == 'windowsusermodedriver8.0' )";
};
}
5. 创建C++静态库包
在PowerShell下运行以下命令构建本地包,本地包默认在脚本所在目录下生成:
Write-NuGetPackage .\EasyXPlus.autopkg
如果运行时PowerShell提示无法加载模块
或者无法加载文件
,可以试着执行set-executionpolicy remotesigned
。
使用CoApp创建NuGet C++静态库包的更多相关文章
- 创建并使用静态库(ar 命令)
创建并使用静态库(ar 命令) archive命令的功能是:创建或改动归档文件或者从归档文件里析取信息.能够简单的理解为一个打包工具,将成员文件依照一定的规则构建到.a文件里, ...
- autotools入门笔记(二)——创建和使用静态库、动态库
带有静态库或者动态库的工程的构建过程与上一节()只包含一个源文件的工程的构建过程是类似的.只是对于复杂的工程,如果包含多个还有源文件的目录时,需要对每个包含源文件的目录执行构建过程,另外创建和使用库文 ...
- # 2017-2018-2 20155228 《信息安全系统设计原理》 使用VirtualStudio2008创建和调用静态库和使用VirtualC++6.0创建和调用动态库
使用virtual c++ 6.0创建和调用动态库 不得不说一下关于环境的问题 只要我打一个响指,一半的安装在win7上的VC6.0都会因为兼容性问题直接崩掉 懒得研究怎么解决兼容性的问题了,直接开一 ...
- Linux中创建和使用静态库&动态库
库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行 Linux下库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在 ...
- gcc创建和使用静态库、动态库
http://www.cnblogs.com/dyllove98/archive/2013/06/25/3155599.html 目录树结构: test/include/hello.h #ifdef ...
- Xcode5创建自己的静态库详解
首先声明: 本人屌丝一枚,如有不对不妥之处,请大牛指正! 1.静态库工程的建立: Xcode New一个新的project,选择IOS下面的Framework&Library,下面有一个Coc ...
- codeblocks创建和使用静态库(C语言)
静态库 (扩展名为 .a 或 .lib) 是包含函数的文件,用于在link阶段整合执行程序,动态链接库(扩展名 .dll)是不在link阶段整合进执行程序中的. DLL文件在执行阶段动态调用 下面 ...
- (一〇四)使用Xcode6创建framework动态静态库
在Xcode6以前,创建framework可以使用iOS-Universal-Framework模板来创建framework,现在苹果已经提供了模板,如下图选择: 使用此模版创建的默认是动态库,方法和 ...
- 演练:创建和使用静态库 (C++)
我们将创建的下一个库类型是静态库 (LIB). 使用静态库是重用代码的一种绝佳方式. 您不必在自己创建的每个程序中重新实现同一例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可. ...
随机推荐
- Collection的迭代器Iterator
Collection -- 迭代的方法 toArray() iterator() 迭代器的作用:抓取集合中的元素 迭代器的方法有 hasNext() next() remove() public ...
- Scrollview中嵌套ListView(自定义组件解决)
首先,ScrollView中只能放一个控件,一般都放LinearLayout,orientation属性值为vertical.在LinearLayout中放需要呈现的内容.ListView也在其中,L ...
- OA办公系统,一个沉淀企业文化的容器
资源是会枯竭的,唯有文化才会生生不息.一切工业产品都是人类智慧创造的.随着公司规模的扩大,企业中两大根本"人和规则"面临诸多挑战,OA办公系统是一个全员使用的办公软件产品,员工可通 ...
- Oracle树形结构查询之prior的理解
--1 建表 create table 宇宙( 行星等级 number ,行星名称 varchar2(50) ,上级行星等级 number); --2 数据准备 insert into 宇宙 (行星等 ...
- dedecms学习笔记
终于弄懂了dedecms的架构和原理,然后搭建了人生中的第一个网站.网站名就不说了. dede的后台在dede中,这是后台代码 templets/default中放的是模板 article 里是文章内 ...
- 谷歌IAP:skusBundle array associated with key ITEM_ID_LIST cannot contain more than 20 items.
这几天在接谷歌的支付,在拉谷歌商品列表的时候转菊花,长时间不返回(querySkuDetails),一开始以为因为IAP有key不对导致的,查了下发现没有问题. 再看logcat,发现了这行: Inp ...
- 深度解析MySQL启动时报“The server quit without updating PID file”错误的原因
很多童鞋在启动mysql的时候,碰到过这个错误, 首先,澄清一点,出现这个错误的前提是:通过服务脚本来启动mysql.通过mysqld_safe或mysqld启动mysql实例并不会报这个错误. 那么 ...
- 浏览器播放rtsp流媒体解决方案
老板提了一个需求,想让网页上播放景区监控的画面,估计是想让游客达到未临其地,已知其境的状态吧. 说这个之前,还是先说一下什么是rtsp协议吧. RTSP(Real Time Streaming ...
- vue的双向绑定原理及实现
前言 使用vue也好有一段时间了,虽然对其双向绑定原理也有了解个大概,但也没好好探究下其原理实现,所以这次特意花了几晚时间查阅资料和阅读相关源码,自己也实现一个简单版vue的双向绑定版本,先上个成果图 ...
- SpringMVC实现账号只能在一处登陆
一.问题引导 在Web开发中,实现一个账号只能在一处登陆有两种形式:1.当某个账号在某处登陆后,如果再在其他处登陆,将前一个账号挤掉:2.当某个账号登陆后,此账号在其他设备登陆提示已经登陆,无法登陆. ...