以一个很简单的例子,日志记录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
这样就集成好了,我们在之后新建或者使用的解决方案中就可以导入改配置,使用这个库了。
四、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路径是很麻烦的的事,这样就很容易了,一键直接搞定~