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

导读

开发环境

版本号描述
操作系统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集成

参考资料

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜猫逐梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值