使用vcpkg自动链接tinyxml2时莫名链接其他库(例如boost)

ops/2024/11/30 13:03:26/
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="markdown_views prism-atom-one-light">cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

cpkgtinyxml2boost_0">使用vcpkg自动链接tinyxml2时莫名链接其他库(例如boost)

<code>vcpkgcode>的自动链接功能非常方便࿰c;但在某些情况下会出现过度链接的问题。

链接错误症状

以<code>tinyxml2code>为例࿰c;程序中调用<code>tinyxml2code>的函数后࿰c;若vcpkg中同时存在<code>opencvcode>和<code>boostcode>库࿰c;自动链接会把本不需要的这两个库的lib也链接上࿰c;导致最后生成的可执行程序exe也依赖<code>opencvcode>和<code>boostcode>的动态库dll。

主程序:

<code class="prism language-cpp">class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><iostream>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><tinyxml2.h>class="token keyword">int class="token function">mainclass="token punctuation">(class="token punctuation">)
class="token punctuation">{tinyxml2class="token double-colon punctuation">::XMLDocument docclass="token punctuation">;stdclass="token double-colon punctuation">::cout class="token operator"><< class="token string">"Hello World!\n"class="token punctuation">; class="token keyword">return class="token number">0class="token punctuation">;
class="token punctuation">}
code>

错误链接boost后࿰c;由于boost某些头文件还包含了BOOST_DLLEXPORT(也就是__declspec(dllexport))字段࿰c;会导致生成.exe的同时还生成.lib和.exp文件࿰c;非常烦人:

c="https://i-blog.csdnimg.cn/direct/e5bf6ed3f35943f0836180a728c58866.png#pic_center" alt="在这里插入图片描述" />

链接错误原理

<code>vcpkgcode>的自动链接功能是通过遍历所有的<code>.libcode>文件实现的࿰c;为程序引用的符号找到对应依赖库。
上述错误是由于<code>tinyxml2code>引用的某些函数所引用的函数在其他<code>.libcode>中首先被找到——即tinyxml2引用的某些函数同时在opencv和boost库中也有定义࿰c;遍历时后者的.lib先于tinyxml2.lib被找到࿰c;从而导致链接了opencv和boost的.lib文件而未链接tinyxml2.lib࿰c;进而仅拷贝了opencv和boost的动态库。

解决方法

对症下药࿰c;提供两种方法避免链接错误。

方法一:不关闭自动链接功能࿰c;在<code>链接器-输入code>中指定<code>tinyxml2.libcode>。<code>链接器-输入code>指定的库链接优先级高于vcpkg的自动链接࿰c;因此链接器首先从tinyxml2.lib中找到了所需函数后࿰c;就终止遍历、不再搜索boost或opencv等vcpkg环境中其他lib里的函数表࿰c;最后只链接tinyxml2.lib。

方法二:关闭自动链接功能࿰c;在<code>链接器-输入code>中指定所依赖库的.lib文件。推荐在方法一不奏效时使用。

cpkg_34">vcpkg自动链接功能

<code>vcpkgcode>是一个跨平台的c++库工具链࿰c;提供了c++库的编译、安装和配置等功能࿰c;可以与MSBuild(VS)、CMake等工具集成使用࿰c;非常方便。
以VS为例࿰c;vcpkg在项目属性中提供了一系列的功能开关࿰c;以使用户更方便地使用库:
c="https://i-blog.csdnimg.cn/direct/f9a13710f4da4d5a90ff6929fb0f699b.png#pic_center" alt="在这里插入图片描述" />
其中的开关顾名思义࿰c;例如“Use Vcpkg”即控制是否在当前项目中使用Vcpkg;“Use AutoLink”控制是否自动链接项目所需.lib库而不需要手动在<code>链接器-输入code>中指定。这两个开关默认都是开启状态。

自动链接功能在项目需要依赖包含多个.lib的库时特别有用࿰c;例如点云处理算法库pcl。
<code>pclcode>在编译时就需要依赖Boost、Eigen、Vtk等库࿰c;编译完成后生成一大堆.lib和.dll。
c="https://i-blog.csdnimg.cn/direct/3899b92aeede41b0a9e87ff5fbf5ba06.png#pic_center" alt="在这里插入图片描述" />

若没有vcpkg࿰c;使用pcl库时更是需要在<code>链接器-输入code>中按需列上boost、vtk和pcl自身的诸多.lib文件࿰c;例如:

c="https://i-blog.csdnimg.cn/direct/232e22fe26174825a4b811c770e8f49a.png#pic_center" alt="在这里插入图片描述" />
为避免重复工作࿰c;多数人选择使用项目属性表将上面的配置记录下来࿰c;以便后续项目使用。

**但是࿰c;**在有了vcpkg之后࿰c;链接工作就大大简化了。vcpkg提供的自动链接功能会遍历所有lib文件࿰c;找到项目所引用函数后将对应lib自动链接上࿰c;不需要用户手动指定链接哪一个lib࿰c;非常省心。

并且࿰c;在编译生成可执行程序后࿰c;vcpkg还会自动将依赖的动态库拷贝到可执行程序所在目录࿰c;方便运行。以包含了OpenCV库的项目为例࿰c;编译生成的结果如下图所示:

c="https://i-blog.csdnimg.cn/direct/a9e85b802bd645a681b36d777d9637ed.png#pic_center" alt="在这里插入图片描述" />
可见࿰c;opencv的一系列动态库和依赖的jpeg、png库都被拷贝到exe旁边了。


http://www.ppmy.cn/ops/137927.html

相关文章

【Python爬虫五十个小案例】爬取豆瓣电影Top250

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 &#x1fab2;前言 在这篇博客中&#xff0c;我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求&#xff0c;…

打造高质量技术文档的关键要素(结合MATLAB)

在技术的浩瀚海洋中&#xff0c;一份优秀的技术文档宛如精准的航海图。它不仅是知识传承的载体&#xff0c;也是团队协作的桥梁&#xff0c;更是产品成功的幕后英雄。打造出色的技术文档并非易事&#xff0c;以下将从多个方向探讨如何做到这一点。 文章目录 方向一&#xff1a;…

openssl 基本命令使用方法

查看OpenSSL的版本信息&#xff1a; root openssl version OpenSSL 3.4.0 22 Oct 2024 (Library: OpenSSL 3.4.0 22 Oct 2024)注&#xff1a;root 代表命令行提示符&#xff0c;不属于输入部分。 获取OpenSSL的帮助信息&#xff1a; root openssl help help:Standard comma…

揭示Lyapunov方法的奥秘:控制理论中的稳定性之钥

揭示Lyapunov方法的奥秘&#xff1a;控制理论中的稳定性之钥 引言 在控制理论和动力系统的研究中&#xff0c;稳定性分析始终是一个核心问题。19世纪末&#xff0c;俄罗斯杰出的数学家亚历山大米哈伊洛维奇李雅普诺夫&#xff08;Aleksandr Mikhailovich Lyapunov&#xff09…

springboot338it职业生涯规划系统--论文pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;it职业生涯规划系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以…

如何借助AI生成PPT,让创作轻松又高效

PPT是现代职场中不可或缺的表达工具&#xff0c;但同时也可能是令人抓狂的时间杀手。几页幻灯片的制作&#xff0c;常常需要花费数小时调整字体、配色与排版。AI的飞速发展为我们带来了革新——AI生成PPT的技术不仅让制作流程大大简化&#xff0c;还重新定义了效率与创意的关系…

Java面向对象.抽象

目录 1.object类 一、Object类的地位 所有类的父类 2.抽象类 一、定义与声明 抽象类的概念 二、抽象方法 抽象方法的特点 三、继承抽象类 子类的责任 3.抽象方法基础理念 1.抽象方法的特征 2.将abstaract加在方法的前面&#xff0c;该类无法被继承 1.首先&#xff0…

java全栈day10--后端Web基础(基础知识)

引言&#xff1a;只要能通过浏览器访问的网站全是B/S架构&#xff0c;其中最常用的服务器就是Tomcat 在浏览器与服务器交互的时候采用的协议是HTTP协议 一、Tomcat服务器 1.1介绍 官网地址&#xff1a;Apache Tomcat - Welcome! 1.2基本使用(网上有安装教程&#xff0c;建议…