LNK2019 错误:在 x64 机器上使用 x86 库 [重复]

Posted

技术标签:

【中文标题】LNK2019 错误:在 x64 机器上使用 x86 库 [重复]【英文标题】:LNK2019 error: Using x86 library on x64 Machine [duplicate] 【发布时间】:2015-08-17 16:46:52 【问题描述】:

我正在尝试在 x64 Windows 7 台式计算机上使用 Visual Studios 2013、OpenCV 2.4.9 和 Qt 5.4 运行一些代码。当我将解决方案平台设置为 Win32 时,代码运行良好。然而,为了让我继续这个项目,我接下来需要实现微软的 Magnification API,它已经在我的计算机的本机操作系统类型上运行,因为它们没有解决一些错误。但是当我将所有设置配置为在 x64 上运行时,出现以下错误:

1>mainwindow.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl INTRAFACE::FaceAlignment::FaceAlignment(char const *,char const *,class INTRAFACE::XXDescriptor const *,class cv::Rect_<double> const &)" (__imp_??0FaceAlignment@INTRAFACE@@QEAA@PEBD0PEBVXXDescriptor@1@AEBV?$Rect_@N@cv@@@Z) referenced in function "private: void __cdecl MainWindow::detect(class cv::VideoCapture,bool)" (?detect@MainWindow@@AEAAXVVideoCapture@cv@@_N@Z)
1>mainwindow.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: enum INTRAFACE::IFRESULT __cdecl INTRAFACE::FaceAlignment::Track(class cv::Mat const &,class cv::Mat const &,class cv::Mat &,float &)" (__imp_?Track@FaceAlignment@INTRAFACE@@QEAA?AW4IFRESULT@2@AEBVMat@cv@@0AEAV45@AEAM@Z) referenced in function "private: void __cdecl MainWindow::detect(class cv::VideoCapture,bool)" (?detect@MainWindow@@AEAAXVVideoCapture@cv@@_N@Z)
1>mainwindow.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: enum INTRAFACE::IFRESULT __cdecl INTRAFACE::FaceAlignment::Detect(class cv::Mat const &,class cv::Rect_<int> const &,class cv::Mat &,float &)" (__imp_?Detect@FaceAlignment@INTRAFACE@@QEAA?AW4IFRESULT@2@AEBVMat@cv@@AEBV?$Rect_@H@5@AEAV45@AEAM@Z) referenced in function "private: void __cdecl MainWindow::detect(class cv::VideoCapture,bool)" (?detect@MainWindow@@AEAAXVVideoCapture@cv@@_N@Z)
1>mainwindow.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: enum INTRAFACE::IFRESULT __cdecl INTRAFACE::FaceAlignment::EstimateHeadPose(class cv::Mat const &,struct INTRAFACE::HeadPose &)" (__imp_?EstimateHeadPose@FaceAlignment@INTRAFACE@@QEAA?AW4IFRESULT@2@AEBVMat@cv@@AEAUHeadPose@2@@Z) referenced in function "private: void __cdecl MainWindow::detect(class cv::VideoCapture,bool)" (?detect@MainWindow@@AEAAXVVideoCapture@cv@@_N@Z)
1>mainwindow.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl INTRAFACE::FaceAlignment::~FaceAlignment(void)" (__imp_??1FaceAlignment@INTRAFACE@@QEAA@XZ) referenced in function "private: void __cdecl MainWindow::detect(class cv::VideoCapture,bool)" (?detect@MainWindow@@AEAAXVVideoCapture@cv@@_N@Z)
1>Q:\eyegaze\x64\Release\\EyeGazeDemo.exe : fatal error LNK1120: 5 unresolved externals

INTRAFACE::FaceAlignment 来自 Intraface 库(即 x86)这是导致问题的原因吗?如果是这样,我该如何解决这个问题?

谢谢!

【问题讨论】:

是的,如果你想将它作为 x64 代码运行,你需要一个 x64 版本的库。 @BoPersson 我有办法自己解决这个问题吗? (我认为没有 x64 版本可供下载) 除非你有所有的源代码,并且可以自己构建x64版本。 Qt 和 OpenCV 具有适用于 Visual Studio 2013 的 64 位二进制文​​件。虽然如果您找不到您所使用的编译器所需的版本,它们都可以很容易地从源代码构建。 【参考方案1】:

我不熟悉 OpenCV,但他们网站上的 this page 建议您应该为每种平台类型设置单独的 bin 和 lib 文件夹。按照惯例,lib 文件夹是链接器用来满足未解析符号的库所在的位置。

您需要做的第一件事是确定您是否拥有 OpenCV 所需的 x64 BIN 和 LIB 文件夹。假设您确实拥有 x64 文件夹,下一步是弄清楚为什么您的 x86 构建链接成功而 x64 构建却没有。

这只是一种猜测,但创建新平台目标时的一个常见失误是忘记调整条目以考虑 OpenCV 等第三方包。例如,您可能已经调整了 VC++ 目录 下的 Library Directories 条目(在 C++ 项目属性中),以在您第一次创建项目时包含 x86 LIB 文件夹,但忘记了x64 版本的项目属性中对应的 x64 LIB 文件夹条目。

要检查的其他 C++ 项目属性包括 Linker 下的 Additional Library Directories > GeneralAdditional dependencies 下的 链接器 > 输入

在每种情况下,您都需要确保如果在您的 x86 配置中设置了该属性,那么在您的 x64 配置中存在合适的相应设置。

这有点费力,但是通过打开项目属性对话框并在 x86 和 x64 之间切换平台下拉菜单,您应该能够看到设置的差异。 IIRC 您还可以将平台下拉菜单设置为“所有平台”,并且属性页将标记在不同平台上具有不同值的属性。请记住,尽管某些属性应该针对不同的平台具有不同的值。

【讨论】:

以上是关于LNK2019 错误:在 x64 机器上使用 x86 库 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

致命错误 LNK1112:模块机器类型“x64”与通过 vcvarsall.bat x86 运行构建的目标机器类型“X86”冲突

致命错误 LNK1112:模块机器类型“X86”与 2010 的目标机器类型“x64”冲突

麻烦构建旧版本的 SIP:致命错误 LNK1112:模块机器类型“x64”与目标机器类型“X86”冲突

LNK1112:模块机器类型“x64”与目标机器类型“x86”冲突-opencv 构建

在 VS2010 中,VC++ 错误 LNK 2019 with CoolProp 5.0.0

尝试在 64 位机器上将 Detours.lib 编译为 32 位:LNK1112:模块机器类型“x86”与目标机器类型“x64”冲突