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