Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Visual Studio LNK1104而不是LNK2019_C++_Visual Studio_Opencv_Boost_Boost Asio - Fatal编程技术网

C++ Visual Studio LNK1104而不是LNK2019

C++ Visual Studio LNK1104而不是LNK2019,c++,visual-studio,opencv,boost,boost-asio,C++,Visual Studio,Opencv,Boost,Boost Asio,我不明白Visual Studio(对我来说是2015)如何从头文件中检测.lib文件名。 示例1 我使用boost/asio编写一个简单的程序,通过HTTP请求进行连接。源文件的顶部包括。我还将C/C++/General/Additional Include目录配置为指向boost的文件夹。 之后,我构建解决方案并遇到一个错误: Error LNK1104 cannot open file 'libboost_system-vc140-mt-gd-1_61.lib' 但是我不知道Visual

我不明白Visual Studio(对我来说是2015)如何从头文件中检测.lib文件名。

示例1
我使用
boost/asio
编写一个简单的程序,通过HTTP请求进行连接。源文件的顶部包括
。我还将
C/C++/General/Additional Include目录配置为指向boost的文件夹。
之后,我构建解决方案并遇到一个错误:

Error LNK1104 cannot open file 'libboost_system-vc140-mt-gd-1_61.lib'

但是我不知道VisualStudio在哪里找到了libboost_system-vc140-mt-gd-1_61.lib这个名字

-在
Linker/Input/Additional Dependencies/Edit…
中查找计算值和继承值,没有名为
libboost\u system-vc140-mt-gd-1\u 61.lib的项
-我认为在
中,它通过某种方式为编译器设置了一些信息:“如果您需要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
而不指定包含
链接器/General/Additional Libary目录中的.lib文件的文件夹。在这种情况下,将抛出
错误LNK1104无法打开文件“abcxyz.lib”

那么,为什么上面的示例会遇到LNK1104错误而不是LNK2019错误?

示例2
我正在为一个使用OpenCV 2.4.10库的项目工作。在发行版中,他们给了我带有源代码的项目,但没有将库附加到我身上。
然后,我下载了最新的OpenCV 2.4.13,并为该项目进行了设置,例如附加include文件夹、附加库文件夹、附加依赖项(
OpenCV_core2413.lib

看起来一切正常,但当我构建项目时,它会给我一个错误:

Error LNK1104 cannot open file 'opencv_core2410d.lib'
我已经查看了计算值(包含opencv_core2413.lib)和继承值的
Linker\Input\Additional Dependencies
,但没有名为“opencv_core2410d.lib”的项。
尝试查找项目应用的另一个共享属性表,但没有名为“opencv_core2410d.lib”的条目项
我想删除此条目,但找不到它的位置


那么,这里发生了什么?有人能为我解释吗?感谢

LNK1104
让您知道需要在
库目录中设置库位置

boost::asio
依赖于
boost::system
获取错误消息。
boost::system
仅标题库

您需要将
boost
库的位置添加到解决方案属性页上
VC++目录下的
库目录中

如果您还没有构建
boost
库,那么这里有一篇文章介绍如何实现它,或者您可以从下载


OpenCV
库的位置添加到解决方案的属性页应该可以修复
示例2

使用visual studio,您可以使用

#pragma comment( lib, "libname.lib" )
这会导致链接器在库路径中查找libname,并确保使用正确的库

可以使用链接上的
/nodefaultlib
禁用此功能

在windows中,类的实现在发布和调试之间发生变化(额外的跟踪成员添加到调试中的结构中)

根据是否调用DllMain,实现整理和CRT启动的机制是不同的

最近的视觉工作室也有

#pragma detect_mismatch( "name", "value")

它在每个对象文件中放置一个声明,声明的值为“value”。这确保了如果结构在版本或编译选项之间发生变化,它们将彼此不兼容。

libboost\u system-vc140-mt-gd-1\u 61.lib
来自
\pragma comment(lib-libboost\u system-vc140-mt-gd-1\u 61.lib)
boost中有一个选项可以关闭它
opencv_core2410d.lib
是调试构建所需的调试导入库。下面是关于#pragma comment(lib libname)的增强使用的更多信息:我知道这一点,但我找不到它的来源。我使用的是OpenCV 2.4.13库+2.4.13.lib文件。旧项目中的某个人是否可以像上面那样添加
#pragma注释(lib opencv_core2410d.lib)
,编译器将查找它?如果有人添加
#pragma注释(lib opencv_core2410d.lib)
链接器将查找它。尽管如果它不在链接器正在搜索库的路径中,它将找不到它。另外,由于
opencv\u core2410d.lib
是一个导入库,并且您正在使用Visual Studio 2015,因此请确保您使用的是vc14文件夹中的opencv二进制文件。您不能安全地使用任何其他编译器或其他版本的Visual Studio编译的opencv。