【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

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提