【vcpkg】boost编译链接总结(探究vcpkg编译boost偷偷做了哪些修改)

2024-02-05 00:40

本文主要是介绍【vcpkg】boost编译链接总结(探究vcpkg编译boost偷偷做了哪些修改),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 导读
      • 开发环境
    • 编译过程
      • 安装vs2019
      • 安装vcpkg
      • 安装指定版本的boost 1.77
    • boost库实战
      • 步骤
    • 编写测试代码-引入lib示例
      • 问题:链接错误
      • 解决思路和方案
    • 文章小结
      • vcpkg install boost:x86-windows-static-rel-v142
      • 其他命令
    • 参考资料

导读

开发环境

版本号描述
操作系统Win11-21H222000.588
VS2019
工作目录J:_ALL\CODE\vcpkg
POCO1.77.0#2

编译过程

安装vs2019

安装vcpkg

打开powershell。
切换到目录cd J:\_ALL\CODE\vcpkg中。

下载代码
可以使用git命令获取官方代码仓库
git clone https://github.com/microsoft/vcpkg
觉得速度慢的,可以使用镜像下载,网站hub.fastgit.xyz的速度还是不错的。
git clone https://hub.fastgit.xyz/microsoft/vcpkg.git

运行bootstrap-vcpkg.bat,初始化vcpkg。

安装指定版本的boost 1.77

# 查看boost版本
.\vcpkg x-history boost# 使用git回退到指定版本
git reset --hard 1f5e8e4e9b5101a04634e83ae20c147042bfafd2# 编译boost(32位、静态库)
.\vcpkg.exe install boost:x86-windows-static


编译结果将保存到x86-windows-static目录中,如下图所示:
在这里插入图片描述
我们发现编译出来的lib标记为了vc140,拿regex为例,我们生成的文件为boost_regex-vc140-mt-gd.lib,而通过boost生成的文件名为libboost_regex-vc142-mt-sgd-x32-1_77.lib。虽然名字不一样,但是内容是一样的(https://github.com/iso8859/vcpkg-boost 项目给了解决名字不一样的方案)。
在这里插入图片描述

boost库实战

步骤

  1. 生成一个MFC工程,指定“在静态库中使用 MFC”。
  1. 设置引入目录/I"J:\_ALL\CODE\vcpkg\vcpkg\installed\x86-windows-static\include"
    在这里插入图片描述
  1. 引入头文件
    #include <boost/regex.hpp>
  1. 编写测试代码一
int 正则测试()
{const char* url = "https://steamcommunity.com/profiles/76561199166454776/friends";boost::regex reg("https://steamcommunity\\.com/profiles/\\d+/friends.*");bool r = boost::regex_match(url, reg);printf("%d", r);r = boost::regex_match("https://steamcommunity.com/xxxprofiles/76561199166454776/friends/add", reg);printf("%d", r);boost::regex reg2(".*visa\\.cn.*");r = boost::regex_match("https://help.visa.cn/zh-cn/wizard/HelpWithGame/?appid=1097150", reg2);printf("[reg2] %d", r);return 0;
}

ps: 目前代码中不需要引入库文件就可以运行,boost大量使用模板,只需要头文件就可以生成使用了。

编写测试代码-引入lib示例

上面的《测试代码》中,只需要头文件就可以实现编译了,下面我们通过编码转换示例,引出vcpkg编译问题。

示例代码二:

	{std::string sSource = "BIG-5字符串";std::wstring ws = boost::locale::conv::to_utf<wchar_t>(sSource, "BIG5");std::string  ss = boost::locale::conv::to_utf<char>(sSource, "BIG5");}

问题:链接错误

众所周知,boost可以通过头文件将对应的lib库引入到项目中,其原理参考文章《Boost库解密——自动链接库(auto_link) https://blog.csdn.net/godmaycry/article/details/78673001》,但是,当我们引入示例代码二的时候,出现了下面链接错误:
在这里插入图片描述
也就是说,未找到链接的库,那么vcpkg为什么没有自动引入链接库呢?

解决思路和方案

首先,我们需要明白,VS链接必然要引入lib库,如果不在VS配置中设置,就需要在代码中引入类似#pragma comment(lib, "***.lib")这样的 代码,显然boost使用的是后者。

然后,我们将vcpkg生成的头文件和通过boost官方教程提供的b2.exe方案生成的头文件进行比较,我们会发现config\user.hpp文件中,增加了宏定义BOOST_ALL_NO_LIB
在这里插入图片描述
该宏的解释如下图所示,即,不自动引入lib库:
在这里插入图片描述

最后,既然vcpkg不自动引入库,那么我们自己引入不就可以了。拿debug环境来说,我们在代码中增加#pragma comment(lib, "boost_locale-vc140-mt-gd.lib"),库目录设置到项目中/LIBPATH:"J:\_ALL\CODE\vcpkg\vcpkg\installed\x86-windows-static\debug\lib" 。再次编译就可以编译通过了。
在这里插入图片描述

ps: 附上引入头文件和库目录的代码,以后就可以直接通过vcpkg生成的库进行编码了,注意根据_DEBUG区分引入不同的库。

#include <boost/filesystem.hpp>
#include <boost/locale.hpp>
#include <boost/regex.hpp>
#include <boost/algorithm/string/regex.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread.hpp>
#include <boost/format.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/foreach.hpp>
#include "boost/filesystem/operations.hpp"
#include "boost/filesystem/path.hpp"
#include <boost/regex.hpp>
#include <boost/date_time.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
#include <boost/asio/streambuf.hpp>
#include <boost/asio/ip/host_name.hpp>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/replace.hpp>
#include <boost/algorithm/string/trim.hpp>
#include <boost/algorithm/string/case_conv.hpp>
#include <boost/algorithm/string/predicate.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/random/random_device.hpp>
#include <boost/random/uniform_int_distribution.hpp>
#include <boost/serialization/singleton.hpp>
#include <boost/property_tree/json_parser.hpp>#ifdef _DEBUG
#pragma comment(lib, "boost_atomic-vc140-mt-gd.lib")
#pragma comment(lib, "boost_chrono-vc140-mt-gd.lib")
#pragma comment(lib, "boost_container-vc140-mt-gd.lib")
#pragma comment(lib, "boost_context-vc140-mt-gd.lib")
#pragma comment(lib, "boost_contract-vc140-mt-gd.lib")
#pragma comment(lib, "boost_coroutine-vc140-mt-gd.lib")
#pragma comment(lib, "boost_date_time-vc140-mt-gd.lib")
#pragma comment(lib, "boost_exception-vc140-mt-gd.lib")
#pragma comment(lib, "boost_fiber-vc140-mt-gd.lib")
#pragma comment(lib, "boost_filesystem-vc140-mt-gd.lib")
#pragma comment(lib, "boost_graph-vc140-mt-gd.lib")
#pragma comment(lib, "boost_iostreams-vc140-mt-gd.lib")
#pragma comment(lib, "boost_json-vc140-mt-gd.lib")
#pragma comment(lib, "boost_locale-vc140-mt-gd.lib")
#pragma comment(lib, "boost_log-vc140-mt-gd.lib")
#pragma comment(lib, "boost_log_setup-vc140-mt-gd.lib")
#pragma comment(lib, "boost_math_c99-vc140-mt-gd.lib")
#pragma comment(lib, "boost_math_c99f-vc140-mt-gd.lib")
#pragma comment(lib, "boost_math_c99l-vc140-mt-gd.lib")
#pragma comment(lib, "boost_math_tr1-vc140-mt-gd.lib")
#pragma comment(lib, "boost_math_tr1f-vc140-mt-gd.lib")
#pragma comment(lib, "boost_math_tr1l-vc140-mt-gd.lib")
#pragma comment(lib, "boost_nowide-vc140-mt-gd.lib")
#pragma comment(lib, "boost_program_options-vc140-mt-gd.lib")
#pragma comment(lib, "boost_python310-vc140-mt-gd.lib")
#pragma comment(lib, "boost_random-vc140-mt-gd.lib")
#pragma comment(lib, "boost_regex-vc140-mt-gd.lib")
#pragma comment(lib, "boost_serialization-vc140-mt-gd.lib")
#pragma comment(lib, "boost_stacktrace_noop-vc140-mt-gd.lib")
#pragma comment(lib, "boost_stacktrace_windbg-vc140-mt-gd.lib")
#pragma comment(lib, "boost_stacktrace_windbg_cached-vc140-mt-gd.lib")
#pragma comment(lib, "boost_system-vc140-mt-gd.lib")
#pragma comment(lib, "boost_thread-vc140-mt-gd.lib")
#pragma comment(lib, "boost_timer-vc140-mt-gd.lib")
#pragma comment(lib, "boost_type_erasure-vc140-mt-gd.lib")
#pragma comment(lib, "boost_unit_test_framework-vc140-mt-gd.lib")
#pragma comment(lib, "boost_wave-vc140-mt-gd.lib")
#pragma comment(lib, "boost_wserialization-vc140-mt-gd.lib")
#else
#pragma comment(lib, "boost_atomic-vc140-mt.lib")
#pragma comment(lib, "boost_chrono-vc140-mt.lib")
#pragma comment(lib, "boost_container-vc140-mt.lib")
#pragma comment(lib, "boost_context-vc140-mt.lib")
#pragma comment(lib, "boost_contract-vc140-mt.lib")
#pragma comment(lib, "boost_coroutine-vc140-mt.lib")
#pragma comment(lib, "boost_date_time-vc140-mt.lib")
#pragma comment(lib, "boost_exception-vc140-mt.lib")
#pragma comment(lib, "boost_fiber-vc140-mt.lib")
#pragma comment(lib, "boost_filesystem-vc140-mt.lib")
#pragma comment(lib, "boost_graph-vc140-mt.lib")
#pragma comment(lib, "boost_iostreams-vc140-mt.lib")
#pragma comment(lib, "boost_json-vc140-mt.lib")
#pragma comment(lib, "boost_locale-vc140-mt.lib")
#pragma comment(lib, "boost_log-vc140-mt.lib")
#pragma comment(lib, "boost_log_setup-vc140-mt.lib")
#pragma comment(lib, "boost_math_c99-vc140-mt.lib")
#pragma comment(lib, "boost_math_c99f-vc140-mt.lib")
#pragma comment(lib, "boost_math_c99l-vc140-mt.lib")
#pragma comment(lib, "boost_math_tr1-vc140-mt.lib")
#pragma comment(lib, "boost_math_tr1f-vc140-mt.lib")
#pragma comment(lib, "boost_math_tr1l-vc140-mt.lib")
#pragma comment(lib, "boost_nowide-vc140-mt.lib")
#pragma comment(lib, "boost_program_options-vc140-mt.lib")
#pragma comment(lib, "boost_python310-vc140-mt.lib")
#pragma comment(lib, "boost_random-vc140-mt.lib")
#pragma comment(lib, "boost_regex-vc140-mt.lib")
#pragma comment(lib, "boost_serialization-vc140-mt.lib")
#pragma comment(lib, "boost_stacktrace_noop-vc140-mt.lib")
#pragma comment(lib, "boost_stacktrace_windbg-vc140-mt.lib")
#pragma comment(lib, "boost_stacktrace_windbg_cached-vc140-mt.lib")
#pragma comment(lib, "boost_system-vc140-mt.lib")
#pragma comment(lib, "boost_thread-vc140-mt.lib")
#pragma comment(lib, "boost_timer-vc140-mt.lib")
#pragma comment(lib, "boost_type_erasure-vc140-mt.lib")
#pragma comment(lib, "boost_unit_test_framework-vc140-mt.lib")
#pragma comment(lib, "boost_wave-vc140-mt.lib")
#pragma comment(lib, "boost_wserialization-vc140-mt.lib")
#endif

ps2: 引入链接库方案二,通过宏MY_BOOST_LIB_TYPE区分debug和release下不同的库,从而减少代码量。

#ifdef _DEBUG
#define MY_BOOST_LIB_TYPE "-mt-gd"
#else
#define MY_BOOST_LIB_TYPE "-mt"
#endif#pragma comment(lib, "boost_atomic-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_chrono-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_container-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_context-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_contract-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_coroutine-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_date_time-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_exception-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_fiber-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_filesystem-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_graph-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_iostreams-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_json-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_locale-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_log-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_log_setup-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_math_c99-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_math_c99f-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_math_c99l-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_math_tr1-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_math_tr1f-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_math_tr1l-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_nowide-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_program_options-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_python310-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_random-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_regex-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_serialization-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_stacktrace_noop-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_stacktrace_windbg-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_stacktrace_windbg_cached-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_system-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_thread-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_timer-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_type_erasure-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_unit_test_framework-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_wave-vc140" MY_BOOST_LIB_TYPE ".lib")
#pragma comment(lib, "boost_wserialization-vc140" MY_BOOST_LIB_TYPE ".lib")

文章小结

vcpkg install boost:x86-windows-static-rel-v142

不支持指定vs版本,默认使用最高版本,其实在目录J:\_ALL\CODE\vcpkg\vcpkg\triplets\community中拷贝一份文件x86-windows-static.cmakex86-windows-static-rel-v142.cmake,增加如下内容即可:

set(VCPKG_VISUAL_STUDIO_PATH "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Professional")
set(VCPKG_PLATFORM_TOOLSET v142)

其他命令

export命令

导出指定安装包,可以指定安装包的导出方式(如raw、nuget、zip、7zip等等),例如以zip压缩包导出gdal安装包可以运行以下命令:

 vcpkg export gdal --zip

upgrade命令
如果希望直接重建所有可升级的安装包,可以用以下方式运行命令vcpkg upgrade --no-dry-run

integrate命令
将vcpkg构建的安装包与Vistual Stuido集成

参考资料

  • [C++ Boost库使用 系列教程] https://tangxing.blog.csdn.net/article/details/116393985
  • https://gitee.com/ineo6/hosts
  • 2022目前三种有效加速国内Github https://juejin.cn/post/7068996624910909471
  • vcpkg快速入门手册_孤独浮云-程序员信息网_vcpkg https://www.i4k.xyz/article/gudufuyun/113787953#31_Boost_484
  • https://github.com/iso8859/vcpkg-boost
  • qq群:夜猫逐梦技术交流裙/953949723
    逐梦中原技术交流QQ群

这篇关于【vcpkg】boost编译链接总结(探究vcpkg编译boost偷偷做了哪些修改)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/679290

相关文章

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

Mysql8.0修改配置文件my.ini的坑及解决

《Mysql8.0修改配置文件my.ini的坑及解决》使用记事本直接编辑my.ini文件保存后,可能会导致MySQL无法启动,因为MySQL会以ANSI编码读取该文件,解决方法是使用Notepad++... 目录Myhttp://www.chinasem.cnsql8.0修改配置文件my.ini的坑出现的问题

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影