2

我在 64 位版本的 Windows 上使用 64 位版本的 Visual Studio 2008。我有一个链接到库(OpenCV 2.1)的项目。我使用相同的编译器从源代码编译了 OpenCV。我的问题发生在发布和调试模式下。

在“属性”窗格或我的项目中,我在 C/C++ ->“其他包含目录”下添加了包含头文件的目录。我已将包含 .lib 文件的目录添加到“附加库目录”中,并且已将库的名称添加到链接器 -> 输入下的“附加依赖项”条目中。

当我编译和链接时,我得到这种风格的错误:错误 LNK2019: unresolved external symbol _cvFloodFill referenced in function "int __cdecl Label(class cvImage &)" (?Label@@YAHAAV?$cvImage@M@@@Z)

在 Linker->Command Line -> Additional options 下,我添加了标签:/verbose:lib,我在编译器输出窗口中看到它正在搜索并查找应该包含函数的库 (cv210d.lib)。(我查看了 OpenCV 的源代码,发现有问题的函数是在这个库中定义的)

1>链接...
1>搜索库
1> 搜索 C:\Program Files\OpenCV2.1\lib\cv210d.lib:

在 OpenCV 源代码中,它具有 extern "C" 声明,其中包含相关函数的声明。

我在库文件上运行了 dumpbin /all,我看到定义了以下符号。(我已经安装了 Windows 的 gnu 工具链,所以我可以使用 grep)。

C:\Program Files\OpenCV2.1\lib>dumpbin /all cv210d.lib | grep cvFloodFill
732B4 __imp_cvFloodFill
732B4 cvFloodFill
1CA __imp_cvFloodFill
1CA cvFloodFill

因此,如您所见,链接器正在寻找符号 _cvFloodFill,但未定义。只定义了 cvFloodFill 和 __imp_cvFloodFill ,所以看起来发生了一些有趣的事情,当我编译库与尝试链接它时,名称修改不同。

所以这就是我卡住的地方。我是否正确解释了这些信息?我需要做些什么来影响名称修改吗?我是否需要使用某种不同的标志来编译库?

4

1 回答 1

1

我找到了。(我发布问题和答案是为了其他有此问题的人的利益,因为我在搜索网络时没有找到类似的东西)。

当我编译 OpenCV 时,在解决方案属性、配置属性 -> 配置下,所有项目的平台都设置为 x64。

当我编译我的项目时,平台设置为 Win32。答案是单击配置管理器,单击项目“平台”下的向下箭头,选择“新建”,然后选择 x64。

因此,现在,该项目和 OpenCV 已针对同一平台进行编译,并且所有内容都链接并正确运行。

于 2010-11-09T18:35:05.747 回答