您的位置:首頁>正文

使用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 ---- v140VS2013 ---- v120VS2012 ---- v110VS2010 ---- 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。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示