【发布时间】:2016-07-17 15:11:50
【问题描述】:
我不明白 Visual Studio(对我来说是 2015 年)如何从头文件中检测 .lib 文件名。
示例 1
我使用boost/asio编写了一个简单的程序来通过HTTP请求进行连接。源文件顶部包含<boost/asio.hpp>。我还将C/C++ / General / Additional Include Directories 配置为指向boost 的文件夹。
之后,我构建解决方案并遇到错误:
Error LNK1104 cannot open file 'libboost_system-vc140-mt-gd-1_61.lib'
但我不知道 Visual Studio 从哪里找到名称 libboost_system-vc140-mt-gd-1_61.lib。
- 在 Linker / Input / Additional Dependencies / Edit... 中查找 Evaluated Value 和 Inherited 值,没有名为 libboost_system-vc140-mt-gd-1_61.lib的项目
- 我认为在<boost/asio.hpp> 中,它以某种方式为编译器设置了一些信息:“如果你需要 lib 文件,请查找 libboost_system-vc140-mt-gd-1_61.lib,它是我的实现”,但我在 boost 文件夹中搜索,没有包含“libboost_system-vc140-mt-gd-1_61.lib”的源文件
通常,如果在头文件中声明了某些函数,而 Visual Studio 无法归档它的实现,则会抛出 LNK2019: unresolved external symbol ...。
那么如果它的实现在abcxyz.lib文件中,用户去Linker / Input / Additional Dependencies并添加abcxyz.lib,没有指定包含Linker / General / Additional Libary Directories中的.lib文件的文件夹。在这种情况下,Error LNK1104 cannot open file 'abcxyz.lib' 将被抛出
那么,为什么上面的例子会遇到 LNK1104 错误而不是 LNK2019 错误呢?
示例 2
我正在为一个使用 OpenCV 2.4.10 库的项目工作。在发行版中,他们为我提供了带有源代码的项目,但没有将库附加给我。
然后,我下载了最新的 OpenCV 2.4.13 并为项目进行了设置,例如附加包含文件夹、附加库文件夹、附加依赖项 (opencv_core2413.lib)。
一切看起来都不错,但是当我构建项目时,它给了我错误:
Error LNK1104 cannot open file 'opencv_core2410d.lib'
我查看了 Linker \ Input \ Additional Dependencies 的评估值(包含 opencv_core2413.lib)和继承值,但没有名为“opencv_core2410d.lib”的项目。
尝试查看该项目应用的另一个共享属性表,但没有名为“opencv_core2410d.lib”的条目项
我想删除这个条目,但找不到它在哪里
那么,这里发生了什么?任何人都可以为我解释一下吗?谢谢
【问题讨论】:
-
libboost_system-vc140-mt-gd-1_61.lib来自#pragma comment(lib libboost_system-vc140-mt-gd-1_61.lib)在 boost 中有一个选项可以关闭它。 boost.org/doc/libs/1_61_0/boost/config/auto_link.hpp -
opencv_core2410d.lib是调试构建所需的调试导入库。 -
这里有更多关于#pragma comment(lib libname) 的提升用法:stackoverflow.com/questions/5184889/…
-
我知道,但我找不到它的来源。我正在使用 OpenCV 2.4.13 库 + 2.4.13 .lib 文件。旧项目中可以有人像上面一样添加
#pragma comment (lib opencv_core2410d.lib),编译器会寻找它吗? -
是的,如果有人添加了
#pragma comment (lib opencv_core2410d.lib),链接器会查找它。虽然如果它不在链接器正在搜索库的路径中,它将找不到它。此外,由于opencv_core2410d.lib是一个导入库,并且您使用的是 Visual Studio 2015,请确保您使用的是 vc14 文件夹中的 opencv 二进制文件。您不能安全地使用使用任何其他编译器或不同版本的 Visual Studio 编译的 opencv。
标签: c++ visual-studio opencv boost boost-asio