使用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.rhkb.cn/news/480501.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gitlab自动打包python项目

现在新版的gitlab可以不用自己配置runner什么的了 直接写.gitlab-ci.yml文件就行&#xff0c;这里给出一个简单的依靠setup把python项目打包成whl文件的方法 首先写.gitlab-ci.yml文件&#xff0c;放到项目根目录里 stages: # List of stages for jobs, and their or…

蓝桥杯每日真题 - 第24天

题目&#xff1a;&#xff08;货物摆放&#xff09; 题目描述&#xff08;12届 C&C B组D题&#xff09; 解题思路&#xff1a; 这道题的核心是求因数以及枚举验证。具体步骤如下&#xff1a; 因数分解&#xff1a; 通过逐一尝试小于等于的数&#xff0c;找到 n 的所有因数…

YOLOv10改进,YOLOv10添加TransNeXt中的ConvolutionalGLU模块,CVPR2024,二次创新C2f结构

摘要 由于残差连接中的深度退化效应,许多依赖堆叠层进行信息交换的高效视觉Transformer模型往往无法形成足够的信息混合,导致视觉感知不自然。为了解决这个问题,作者提出了一种聚合注意力(Aggregated Attention),这是一种基于仿生设计的token混合器,模拟了生物的中央凹…

(微信小程序)基于Spring Boot的校园失物招领平台的设计与实现(vue3+uniapp+mysql)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

快速排序hoare版本和挖坑法(代码注释版)

hoare版本 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h>// 交换函数 void Swap(int* p1, int* p2) {int tmp *p1;*p1 *p2;*p2 tmp; }// 打印数组 void _printf(int* a, int n) {for (int i 0; i < n; i) {printf("%d ", a[i]);}printf("…

C++ 【异步日志模块和std::cout << 一样使用习惯替代性好】 使用示例,后续加上远程日志

简单 易用 使用示例 CLogSystem::Instance().SetLogLevel( E_LOG_LEVEL::LOG_LEVEL_INFO | E_LOG_LEVEL::LOG_LEVEL_DEBUG | E_LOG_LEVEL::LOG_LEVEL_DUMP );CLogSystem::Instance().SetFileInfo(true, "./log.txt");LogDebug() << 12;LogInfo() << &qu…

LINUX c++环境

安装docker 拉取code-server镜像 1.安装GCC&#xff0c;GDB yum -y install gcc yum -y install gcc-c yum install gdb 创建文件夹和文件 linux下C开发_linux c-CSDN博客 第一步:预处理&#xff1a;将源代码的.c 、.cpp 、.h 等文件包含到一个文件中&#xff0c;预处理结…

【论文阅读】 Learning to Upsample by Learning to Sample

论文结构目录 一、之前的上采样器二、DySample概述三、不同上采样器比较四、整体架构五、设计过程&#xff08;1&#xff09;初步设计&#xff08;2&#xff09;第一次修改&#xff08;3&#xff09;第二次修改&#xff08;4&#xff09;第三次修改 六、DySample四种变体七、复…

源码安装triton 及出错处理,跟最简应用示例 01 vectorAdd 验证

-1, 源码安装 triton出错信息 WARNING: The user site-packages directory is disabled. error: cant create or remove files in install directory The following error occurred while trying to add or remove files in the installation…

EC2还原快照

EC2还原快照 AWS EC2 磁盘快照 是您 Amazon Elastic Block Store (EBS) 卷在特定时间点的增量备份。您可以使用快照创建 EBS 卷的副本&#xff0c;以便在出现故障时恢复数据或将数据迁移到其他区域。 创建磁盘快照 找到ec2实例挂载的磁盘&#xff0c;直接选择创建快照 等待创建…

提升数据分析效率:Excel Power Query和Power Pivot的妙用

在日常工作中&#xff0c;微软的Excel Power Query和Power Pivot是提升数据处理和分析效率的利器。他们的特点也各不相同&#xff0c;Power Query侧重数据的高效导入与清洗&#xff0c;Power Pivot更测试数据建模与复杂计算。下面将介绍它们各自的功能&#xff0c;并提供应用案…

优先算法 —— 双指针系列 - 快乐数

1. 快乐数 题目链接&#xff1a; 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/happy-number/description/ 2. 题目解析 示例1&#xff1a; 示例2&#xff1a; 3. 算法原理 两种情况&#xff1a;我们可以把两种情况都看作为循环&#xff0…

【C++打怪之路Lv16】-- map set

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

AD7606使用方法

AD7606是一款8通道最高16位200ksps的AD采样芯片。5V单模拟电源供电&#xff0c;真双极性模拟输入可以选择10 V&#xff0c;5 V两种量程。支持串口与并口两种读取方式。 硬件连接方式&#xff1a; 配置引脚 引脚功能 详细说明 OS2 OS1 OS2 过采样率配置 000 1倍过采样率 …

利用Python爬虫获取1688商品类目:技术解析

在电商领域&#xff0c;数据的获取和分析对于市场趋势的把握至关重要。1688作为中国领先的B2B电商平台&#xff0c;其商品类目的数据对于商家来说具有极高的价值。本文将详细介绍如何使用Python编写爬虫程序&#xff0c;以合法合规的方式获取1688商品类目信息。 Python爬虫技术…

全文单词统计

目标&#xff1a;统计词频 import scala.io.Source //知识点 //1.字符串.split("分隔符")&#xff1a;把字符串用指定的分隔符。拆分成多份&#xff0c;保存在数组中 object test1 {def main(args: Array[String]): Unit { //从文件1.txt中读入内容val contentSourc…

【SPIE出版|四大高校联合举办】先进算法与图像处理技术国际学术会议(IC-AAIP 2025)

&#x1f4da;IC-AAIP 2025【ISSN:0277786X】 2025年先进算法与图像处理技术国际学术会议 ⏰时间&#xff1a;2025年8月9日至10日 &#x1f440;地点&#xff1a;中国沈阳 &#x1f4dd;出版商&#xff1a;SPIE 组委负责人刘老师&#xff1a;13660240104 2025年先…

小程序-基于java+SpringBoot+Vue的戏曲文化苑小程序设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

【C/C++】内存管理详解:从new/delete到智能指针的全面解析

文章目录 更多文章C/C中的传统内存管理方式new和delete运算符malloc和free函数传统内存管理的弊端 智能指针的崛起智能指针的定义与作用C11引入的标准智能指针 详解C标准智能指针std::unique_ptr特点使用方法适用场景 std::shared_ptr特点使用方法适用场景 std::weak_ptr特点使…

通过 SSH 进行WordPress网站的高级服务器管理

我在管理hostease的服务器时&#xff0c;时常需要通过SSH登录服务器进行修改。而在网站管理中&#xff0c;SSH不仅是一个基础工具&#xff0c;更是高级用户用来精细化管理和优化服务器的重要工具。通过SSH&#xff0c;你可以深入监控服务器的性能、精细管理系统资源&#xff0c…