【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

相关文章

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. 提

Linux文件名修改方法大全

《Linux文件名修改方法大全》在Linux系统中,文件名修改是一个常见且重要的操作,文件名修改可以更好地管理文件和文件夹,使其更具可读性和有序性,本文将介绍三种在Linux系统下常用的文件名修改方法... 目录一、引言二、使用mv命令修改文件名三、使用rename命令修改文件名四、mv命令和rename命

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Linux下修改hostname的三种实现方式

《Linux下修改hostname的三种实现方式》:本文主要介绍Linux下修改hostname的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下修改ho编程stname三种方式方法1:修改配置文件方法2:hFvEWEostnamectl命

Git如何修改已提交人的用户名和邮箱

《Git如何修改已提交人的用户名和邮箱》文章介绍了如何修改Git已提交人的用户名和邮箱,包括注意事项和具体步骤,确保操作正确无误... 目录git修改已提交人的用户名和邮箱前言第一步第二步总结git修改已提交人的用户名和邮箱前言需注意以下两点内容:需要在顶层目录下(php就是 .git 文件夹所在的目