windows下使用vcpkg发布一个静态库(闭源)并使用

2022-07-18 12:19:43

以一个很简单的例子,日志记录logtest为例,将以下代码做成静态库用vcpkg发布,并集成使用。vcpkg本身的安装和环境变量设置很简单,使用过程中遇到到的依赖项vcpkg会自动下载,如果遇到下载的慢的项可以手动下载然后按照规定的名称保存在downloads文件夹中即可,这里不再详细讲述。

一、准备logtest源码及二进制github

头文件.h:

#ifndef __LOGTEST__H__#define __LOGTEST__H__#include<string>#include<sstream>usingnamespace std;classLogTest{public:staticvoidtestLog(constchar* file,int lineno,const string&nameStr,const string&argStr);template<typename...Args>static stringgetArgs(Args&&...args);};template<typename...Args>static stringgetArgs(Args&&...args){
    stringstream argsStream;((argsStream<< args<<", "),...);return argsStream.str();}#define TEST_LOG(...) LogTest::testLog(__FILE__, __LINE__, #__VA_ARGS__, getArgs(__VA_ARGS__));#endif

源文件cpp:

#include"logtest.h"#include<vector>#include<iterator>#include<iostream>#include<regex>void LogTest::testLog(constchar* file,int lineno,const string&nameStr,const string&argStr){
    regex re{"\\s{0,},\\s{0,}"};
    vector<string> nameList= vector<string>{sregex_token_iterator(nameStr.begin(), nameStr.end(), re,-1),sregex_token_iterator()};
    vector<string> argList= vector<string>{sregex_token_iterator(argStr.begin(), argStr.end(), re,-1),sregex_token_iterator()};

    cout<<"file: "<< file<<" line: "<< lineno<<" "<< argList[0]<<" ";for(size_t i=1; i< nameList.size(); i++){
        cout<<"("<< nameList[i]<<" : "<< argList[i]<<")";}
    cout<< endl;}

代码很简单,关于代码的功能可以移步c++实现高自由自定义变长参数日志输出
众所周知,vcpkg是集成第三方开源工具的,因为项目需要,不能开源,但是又要使用vcpkg,所以方案是提前将代码编译成二进制,然后使用vcpkg直接安装。
首先,将以上代码按照不同平台编译成静态库。

vcpkg需要用到CMakeLists.txt。我们新建一个CMakeLists.txt,因为是闭源,直接使用二进制,不需要再编译,所以这里CMakeLists.txt很简单:两行代码

PROJECT(logtest)
ADD_DEFINITIONS(-DPOSIX)

然后我们将如下目录一起上传到github:(LICENSE可以随便写,命名保持一样即可,vcpkg需要)
在这里插入图片描述

代码仓地址:https://github.com/wulan-17/wulan-vcpkg-test
然后我们为代码打一个tag,标识版本。然后如图复制地址保存,此处复制地址为:https://github.com/wulan-17/wulan-vcpkg-test/archive/refs/tags/1.0.zip
在这里插入图片描述
ps∶不一定非要是github,你自己有服务器也可以用自己的地址,只要能指向下载源码包就行。
二、创建logtest包

这里的地址即上图复制的地址

vcpkg create vcpkglogtest https://github.com/wulan-17/wulan-vcpkg-test/archive/refs/tags/1.0.zip

执行以上命令后,在vcpkg\ports目录就生成了vcpkglogtest,在vcpkglogtest目录下还会生成portfile.cmake和vcpkgjson两个文件,我们需要对其进行修改。
在这里插入图片描述

1.vcpkg.json如下,需要给name赋值,可以随便写一个vcpkglogtest,如果为空,install时会报错

$.features[0].name(an identifier): must be lowercase alphanumeric+hyphens and not reserved

在这里插入图片描述
2.portfile.cmake修改前如下:

# Common Ambient Variables:#   CURRENT_BUILDTREES_DIR    = ${VCPKG_ROOT_DIR}\buildtrees\${PORT}#   CURRENT_PACKAGES_DIR      = ${VCPKG_ROOT_DIR}\packages\${PORT}_${TARGET_TRIPLET}#   CURRENT_PORT_DIR          = ${VCPKG_ROOT_DIR}\ports\${PORT}#   CURRENT_INSTALLED_DIR     = ${VCPKG_ROOT_DIR}\installed\${TRIPLET}#   DOWNLOADS                 = ${VCPKG_ROOT_DIR}\downloads#   PORT                      = current port name (zlib, etc)#   TARGET_TRIPLET            = current triplet (x86-windows, x64-windows-static, etc)#   VCPKG_CRT_LINKAGE         = C runtime linkage type (static, dynamic)#   VCPKG_LIBRARY_LINKAGE     = target library linkage type (static, dynamic)#   VCPKG_ROOT_DIR            = <C:\path\to\current\vcpkg>#   VCPKG_TARGET_ARCHITECTURE = target architecture (x64, x86, arm)#   VCPKG_TOOLCHAIN           = ON OFF#   TRIPLET_SYSTEM_ARCH       = arm x86 x64#   BUILD_ARCH                = "Win32" "x64" "ARM"#   MSBUILD_PLATFORM          = "Win32"/"x64"/${TRIPLET_SYSTEM_ARCH}#   DEBUG_CONFIG              = "Debug Static" "Debug Dll"#   RELEASE_CONFIG            = "Release Static"" "Release DLL"#   VCPKG_TARGET_IS_WINDOWS#   VCPKG_TARGET_IS_UWP#   VCPKG_TARGET_IS_LINUX#   VCPKG_TARGET_IS_OSX#   VCPKG_TARGET_IS_FREEBSD#   VCPKG_TARGET_IS_ANDROID#   VCPKG_TARGET_IS_MINGW#   VCPKG_TARGET_EXECUTABLE_SUFFIX#   VCPKG_TARGET_STATIC_LIBRARY_SUFFIX#   VCPKG_TARGET_SHARED_LIBRARY_SUFFIX## 	See additional helpful variables in /docs/maintainers/vcpkg_common_definitions.md# # Specifies if the port install should fail immediately given a condition# vcpkg_fail_port_install(MESSAGE "vcpkglogtest currently only supports Linux and Mac platforms" ON_TARGET "Windows")

vcpkg_download_distfile(ARCHIVE
    URLS"https://github.com/wulan-17/wulan-vcpkg-test/archive/refs/tags/1.0.zip"
    FILENAME"1.0.zip"
    SHA512 a08b53aeb1d804951394704d18015830688db45cc7bfb009ef4e6c8bccc3ea4d4f709a840213561761b6b5544513d71932d0d7676ee14832abad281df85de5b7)

vcpkg_extract_source_archive_ex(
    OUT_SOURCE_PATH SOURCE_PATH
    ARCHIVE${ARCHIVE}# (Optional) A friendly name to use instead of the filename of the archive (e.g.: a version number or tag).# REF 1.0.0# (Optional) Read the docs for how to generate patches at:# https://github.com/Microsoft/vcpkg/blob/master/docs/examples/patching.md# PATCHES#   001_port_fixes.patch#   002_more_port_fixes.patch)# # Check if one or more features are a part of a package installation.# # See /docs/maintainers/vcpkg_check_features.md for more details# vcpkg_check_features(OUT_FEATURE_OPTIONS FEATURE_OPTIONS#   FEATURES # <- Keyword FEATURES is required because INVERTED_FEATURES are being used#     tbb   WITH_TBB#   INVERTED_FEATURES#     tbb   ROCKSDB_IGNORE_PACKAGE_TBB# )

vcpkg_configure_cmake(
    SOURCE_PATH${SOURCE_PATH}
    PREFER_NINJA# Disable this option if project cannot be built with Ninja# OPTIONS -DUSE_THIS_IN_ALL_BUILDS=1 -DUSE_THIS_TOO=2# OPTIONS_RELEASE -DOPTIMIZE=1# OPTIONS_DEBUG -DDEBUGGABLE=1)

vcpkg_install_cmake()# # Moves all .cmake files from /debug/share/vcpkglogtest/ to /share/vcpkglogtest/# # See /docs/maintainers/vcpkg_fixup_cmake_targets.md for more details# vcpkg_fixup_cmake_targets(CONFIG_PATH cmake TARGET_PATH share/vcpkglogtest)# # Handle copyright# file(INSTALL ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/vcpkglogtest RENAME copyright)

由于这里我们是不编译,直接使用下载下来的二进制,所以修改如下:

# Common Ambient Variables:#   CURRENT_BUILDTREES_DIR    = ${VCPKG_ROOT_DIR}\buildtrees\${PORT}#   CURRENT_PACKAGES_DIR      = ${VCPKG_ROOT_DIR}\packages\${PORT}_${TARGET_TRIPLET}#   CURRENT_PORT_DIR          = ${VCPKG_ROOT_DIR}\ports\${PORT}#   CURRENT_INSTALLED_DIR     = ${VCPKG_ROOT_DIR}\installed\${TRIPLET}#   DOWNLOADS                 = ${VCPKG_ROOT_DIR}\downloads#   PORT                      = current port name (zlib, etc)#   TARGET_TRIPLET            = current triplet (x86-windows, x64-windows-static, etc)#   VCPKG_CRT_LINKAGE         = C runtime linkage type (static, dynamic)#   VCPKG_LIBRARY_LINKAGE     = target library linkage type (static, dynamic)#   VCPKG_ROOT_DIR            = <C:\path\to\current\vcpkg>#   VCPKG_TARGET_ARCHITECTURE = target architecture (x64, x86, arm)#   VCPKG_TOOLCHAIN           = ON OFF#   TRIPLET_SYSTEM_ARCH       = arm x86 x64#   BUILD_ARCH                = "Win32" "x64" "ARM"#   MSBUILD_PLATFORM          = "Win32"/"x64"/${TRIPLET_SYSTEM_ARCH}#   DEBUG_CONFIG              = "Debug Static" "Debug Dll"#   RELEASE_CONFIG            = "Release Static"" "Release DLL"#   VCPKG_TARGET_IS_WINDOWS#   VCPKG_TARGET_IS_UWP#   VCPKG_TARGET_IS_LINUX#   VCPKG_TARGET_IS_OSX#   VCPKG_TARGET_IS_FREEBSD#   VCPKG_TARGET_IS_ANDROID#   VCPKG_TARGET_IS_MINGW#   VCPKG_TARGET_EXECUTABLE_SUFFIX#   VCPKG_TARGET_STATIC_LIBRARY_SUFFIX#   VCPKG_TARGET_SHARED_LIBRARY_SUFFIX## 	See additional helpful variables in /docs/maintainers/vcpkg_common_definitions.md# # Specifies if the port install should fail immediately given a condition# vcpkg_fail_port_install(MESSAGE "vcpkglogtest currently only supports Linux and Mac platforms" ON_TARGET "Windows")

vcpkg_download_distfile(ARCHIVE
    URLS"https://github.com/wulan-17/wulan-vcpkg-test/archive/refs/tags/1.0.zip"
    FILENAME"1.0.zip"
    SHA512 a08b53aeb1d804951394704d18015830688db45cc7bfb009ef4e6c8bccc3ea4d4f709a840213561761b6b5544513d71932d0d7676ee14832abad281df85de5b7)

vcpkg_extract_source_archive_ex(
    OUT_SOURCE_PATH SOURCE_PATH
    ARCHIVE${ARCHIVE}# (Optional) A friendly name to use instead of the filename of the archive (e.g.: a version number or tag).# REF 1.0.0# (Optional) Read the docs for how to generate patches at:# https://github.com/Microsoft/vcpkg/blob/master/docs/examples/patching.md# PATCHES#   001_port_fixes.patch#   002_more_port_fixes.patch)# # Check if one or more features are a part of a package installation.# # See /docs/maintainers/vcpkg_check_features.md for more details# vcpkg_check_features(OUT_FEATURE_OPTIONS FEATURE_OPTIONS#   FEATURES # <- Keyword FEATURES is required because INVERTED_FEATURES are being used#     tbb   WITH_TBB#   INVERTED_FEATURES#     tbb   ROCKSDB_IGNORE_PACKAGE_TBB# )# vcpkg_configure_cmake(#     SOURCE_PATH ${SOURCE_PATH}#     PREFER_NINJA # Disable this option if project cannot be built with Ninja#     # OPTIONS -DUSE_THIS_IN_ALL_BUILDS=1 -DUSE_THIS_TOO=2#     # OPTIONS_RELEASE -DOPTIMIZE=1#     # OPTIONS_DEBUG -DDEBUGGABLE=1# )# vcpkg_install_cmake()# # Moves all .cmake files from /debug/share/vcpkglogtest/ to /share/vcpkglogtest/# # See /docs/maintainers/vcpkg_fixup_cmake_targets.md for more details# vcpkg_fixup_cmake_targets(CONFIG_PATH cmake TARGET_PATH share/vcpkglogtest)# # Handle copyright# file(INSTALL ${SOURCE_PATH}/LICENSE DESTINATION ${CURRENT_PACKAGES_DIR}/share/vcpkglogtest RENAME copyright)

file(MAKE_DIRECTORY${CURRENT_PACKAGES_DIR}/lib)
file(MAKE_DIRECTORY${CURRENT_PACKAGES_DIR}/debug/lib)
file(MAKE_DIRECTORY${CURRENT_PACKAGES_DIR}/include)

file(COPY${SOURCE_PATH}/logtest.h DESTINATION${CURRENT_PACKAGES_DIR}/include)
file(COPY${SOURCE_PATH}/${TRIPLET_SYSTEM_ARCH}/logtest-debug.lib DESTINATION${CURRENT_PACKAGES_DIR}/debug/lib)
file(COPY${SOURCE_PATH}/${TRIPLET_SYSTEM_ARCH}/logtest-release.lib DESTINATION${CURRENT_PACKAGES_DIR}/lib)

file(COPY${SOURCE_PATH}/LICENSE DESTINATION${CURRENT_PACKAGES_DIR}/share/vcpkglogtest)
file(RENAME${CURRENT_PACKAGES_DIR}/share/vcpkglogtest/LICENSE${CURRENT_PACKAGES_DIR}/share/vcpkglogtest/copyright)

注意LICENSE必须要有,否则会报错,lib、include和LICENSE的文件夹位置也不能变,否则后续安装会报错。

PS:release对应lib目录,debug对应debug/lib目录,上传github时需保持和TRIPLET_SYSTEM_ARCH一样(x86\x64\arm64)

三、安装logtest包
按不同CPU安装

vcpkginstall vcpkglogtest:x86-windows
vcpkginstall vcpkglogtest:x64-windows
vcpkginstall vcpkglogtest:arm64-windows

在这里插入图片描述

这样就我们自己写的Logtest小工具安装好了,它会以静态库的形式存在vcpkg中。

四、集成到工程中
安装我们自己写的库后怎么使用了,首先我们先将vcpkg集成到工程中。执行命令:

vcpkg integrate project

这时候会在“\scripts\buildsystems”目录下,生成nuget配置文件.
这样就集成好了,我们在之后新建或者使用的解决方案中就可以导入改配置,使用这个库了。

四、logtestSample使用
我们新建一个logtestSample简单控制台应用,代码简单:

// logtestSample.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include<logtest.h>// debug:#pragma comment(lib, "logtest-debug.lib")// release:// #pragma comment(lib, "logtest-release.lib")intmain(){int www=5;double sdf=3.2;
	string ABC="aasdas";TEST_LOG("just test", www, sdf, ABC);TEST_LOG("just test2222");getchar();}// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单// 调试程序: F5 或调试 >“开始调试”菜单// 入门使用技巧://   1. 使用解决方案资源管理器窗口添加/管理文件//   2. 使用团队资源管理器窗口连接到源代码管理//   3. 使用输出窗口查看生成输出和其他消息//   4. 使用错误列表窗口查看错误//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

然后我们点击菜单“工具->NuGet包管理器->程序包管理器设置”,进入设置界面,点击“程序包源”。
在这里插入图片描述
点击“加号”增加一个源。修改源的名字为vcpkg。在“源”的选项中点击右侧的”…”选择vcpkg目录下的“scripts\buildsystems”目录,然后点击右侧的“更新按钮”。

点击“确定”,关闭设置对话框。

到此,全局性的设置已经完成,以后更新或增加了第三方库也不必再重复设置了。
然后我们选择logtestSample这个解决方案,右键点击选择“管理NuGet程序包”。在右上角的“程序包源”中选择刚刚设置的“vcpkg”。这样在“浏览”选项卡中就可以看到“vcpkg.H.Repos.vcpkg”。点击最右侧的“安装”。这样就可以集成到某个工程了。
在这里插入图片描述
弹出框选择确定。大功告成。
PS:由于这个第三方库是c++17标准,记得把logtestSample的c++语言标准改成c++17.
在这里插入图片描述
生成解决方案:(debug-x86)
在这里插入图片描述
运行:
在这里插入图片描述
生成解决方案:(release-x86)
在这里插入图片描述
生成解决方案:(release-arm64)
在这里插入图片描述

优势体现:你不用设置include,不用配置不同平台的lib路径,直接就可以包含logtest.h文件,调用其中函数。都知道,如果平台很多的话,依赖第三方库设置include、lib路径是很麻烦的的事,这样就很容易了,一键直接搞定~

  • 作者:吵山从逃
  • 原文链接:https://blog.csdn.net/u011018840/article/details/118415318
    更新时间:2022-07-18 12:19:43