可以挣钱的设计网站,厚昌营销网站建设,做统计图的网站,重庆有那些制作网站的公司使用vcpkg自动链接tinyxml2时莫名链接其他库#xff08;例如boost#xff09;
vcpkg的自动链接功能非常方便#xff0c;但在某些情况下会出现过度链接的问题。
链接错误症状
以tinyxml2为例#xff0c;程序中调用tinyxml2的函数后#xff0c;若vcpkg中同时存在opencv和…使用vcpkg自动链接tinyxml2时莫名链接其他库例如boost
vcpkg的自动链接功能非常方便但在某些情况下会出现过度链接的问题。
链接错误症状
以tinyxml2为例程序中调用tinyxml2的函数后若vcpkg中同时存在opencv和boost库自动链接会把本不需要的这两个库的lib也链接上导致最后生成的可执行程序exe也依赖opencv和boost的动态库dll。
主程序
#include iostream
#include tinyxml2.hint 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库的编译、安装和配置等功能可以与MSBuildVS、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旁边了。