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

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

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

头文件.h:

#ifndef __LOGTEST__H__
#define __LOGTEST__H__

#include <string>
#include <sstream>

using namespace std;

class LogTest
{
public:
    static void testLog(const char* file, int lineno, const string &nameStr, const string &argStr);
    
    template<typename ...Args>
    static string getArgs(Args && ...args);
};

template<typename ...Args>
static string getArgs(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(const char* 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安装

vcpkg install vcpkglogtest:x86-windows
vcpkg install vcpkglogtest:x64-windows
vcpkg install 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")

int main()
{
	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路径是很麻烦的的事,这样就很容易了,一键直接搞定~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值