当前位置: 首页 > article >正文

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

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

vcpkg的自动链接功能非常方便,但在某些情况下会出现过度链接的问题。

链接错误症状

tinyxml2为例,程序中调用tinyxml2的函数后,若vcpkg中同时存在opencvboost库,自动链接会把本不需要的这两个库的lib也链接上,导致最后生成的可执行程序exe也依赖opencvboost的动态库dll。

主程序:

#include <iostream>
#include <tinyxml2.h>

int main()
{
    tinyxml2::XMLDocument doc;
    std::cout << "Hello World!\n"; 
    return 0;
}

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

在这里插入图片描述

链接错误原理

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

解决方法

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

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

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

vcpkg自动链接功能

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

自动链接功能在项目需要依赖包含多个.lib的库时特别有用,例如点云处理算法库pcl。
pcl在编译时就需要依赖Boost、Eigen、Vtk等库,编译完成后生成一大堆.lib和.dll。
在这里插入图片描述

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

在这里插入图片描述
为避免重复工作,多数人选择使用项目属性表将上面的配置记录下来,以便后续项目使用。

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

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

在这里插入图片描述
可见,opencv的一系列动态库和依赖的jpeg、png库都被拷贝到exe旁边了。


http://www.kler.cn/a/416201.html

相关文章:

  • 基于单片机的温度控制系统设计
  • 【IEEE出版】2024年大数据、神经网络与深度学习研讨会(BDNNDL 2024,12月13日-15日)
  • 重装系统后恢复matlab和anaconda的方法
  • 嵌入式Qt使用ffmpeg视频开发记录
  • 穿越机与无人机的区别:深入解析
  • 【Leetcode 每日一题】3250. 单调数组对的数目 I
  • 【C#】C# resx方式实现多语言切换(静态切换)
  • RAG架构类型
  • 物联网客户端在线服务中心(客服功能/私聊/群聊/下发指令等功能)
  • 【视频】OpenCV:读写视频文件VideoCapture和VideoWriter
  • HarmonyOS4+NEXT星河版入门与项目实战(23)------实现手机游戏摇杆功能
  • Flink四大基石之Time (时间语义) 的使用详解
  • Android使用UVCCamera打开USBCamera-预览
  • 安卓-碎片的使用入门
  • 浏览器的数据六种存储方法比较 :LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite
  • 设计一个基于 LSTM 神经网络的文本分类器
  • 如何利用Java爬虫获取1688关键词接口的深度解析
  • String的设计,用到了哪些设计模式?
  • Window 安装 Nginx
  • JavaScript零基础入门速通(完整)