<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"> tinyxml2 XMLDocument doc stdcout 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.libc;进而仅拷贝了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文件。推荐在方法一不奏效时使用。
<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="在这里插入图片描述" />
若没有vcpkgc;使用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;不需要用户手动指定链接哪一个libc;非常省心。
并且c;在编译生成可执行程序后c;vcpkg还会自动将依赖的动态库拷贝到可执行程序所在目录c;方便运行。以包含了OpenCV库的项目为例c;编译生成的结果如下图所示:
c="https://i-blog.csdnimg.cn/direct/a9e85b802bd645a681b36d777d9637ed.png#pic_center" alt="在这里插入图片描述" />
可见c;opencv的一系列动态库和依赖的jpeg、png库都被拷贝到exe旁边了。