【问题标题】:Unresolved symbols when linking a program with a library using C++Amp under MSVC++ 2012在 MSVC++ 2012 下使用 C++Amp 将程序与库链接时出现未解析的符号
【发布时间】:2014-01-30 14:23:03
【问题描述】:

我正在尝试解决以下问题:我有一个使用 C++Amp 的库。该库编译时没有任何警告,并且单元测试表明一切正常。我有一个基于 QT 的项目,它是这个库的 GUI,问题就从这里开始了。每次我编译 GUI 时,在链接阶段都会出现以下错误:

widgets.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) private: unsigned short const * __cdecl Concurrency::accelerator::_Get_device_path(void)const " (_imp?_Get_device_path@加速器@Concurrency@@AEBAPEBGXZ) 在函数“void __cdecl `dynamic initializer for 'public: static class std::_Future_error_category std::_Future_error_object::_Future_object''(void)”(??__E?_Future_object@?$_Future_error_object@ H@std@@2V_Future_error_category@2@A@@YAXXZ)

该库链接到 lib 文件,而不是 dll。

项目中的其他目标文件也是如此。在使用 C++Amp 时,有没有人在链接阶段遇到过类似的问题。我确信这是一个非常容易解决的问题,但目前我不知道该怎么做。提前致谢。

更新:当我尝试将 QT 项目包含在 MSVC++ 中时,也会发生同样的情况。

【问题讨论】:

  • 我假设你得到了这些?您似乎没有将 AMP 二进制文件链接到您的 QT 项目中。
  • 是的,我收到了很多。实际上我有一个静态库项目(ccilib),它是一个静态库(lib 文件),当我尝试运行与 cci 项目链接的 QT 项目(GUI)时会出现问题。我应该如何链接 AMP 二进制文件?
  • 您的编译器设置错误。在将 C/C++、语言、将 wchar_t 视为内置类型重置为默认值之前,您无法获得链接代码。您需要在所有编译代码中一致地使用此设置,包括 Qt。
  • 我应该如何为 QT 更改它?重新编译?
  • 我按照你说的设置了,还是不行。

标签: c++ qt visual-c++ linker c++-amp


【解决方案1】:
  __imp_?_Get_device_path@accelerator@Concurrency@@AEBAPEBGXZ

在该字符串上运行 undname.exe 实用程序以解开名称,我得到:

  declspec(dllimport) private: 
  unsigned short const * __ptr64 
  __cdecl Concurrency::accelerator::_Get_device_path(void)const __ptr64

所以它是 64 位代码。在 vc/lib/amd64/vcamp.lib 中查找最接近的匹配项,我发现:

 ?_Get_device_path@accelerator@Concurrency@@AEBAPEB_WXZ

这与 undname.exe 解缠结为:

 private: 
 wchar_t const * __ptr64 
 __cdecl Concurrency::accelerator::_Get_device_path(void)const __ptr64

注意差异。你的函数被编译返回unsigned short*,库函数返回wchar_t*。您的编译器设置错误。 Project + Properties、C/C++、Language、Treat WChar_t As Built in Type 必须设置为默认值“是”。

【讨论】:

  • 我已经试过了,但是设置的时候好像遇到了一些其他的QT错误。这是我得到的错误:error C2664: 'QString::fromUtf16' : cannot convert parameter 1 from 'const wchar_t [10]' to 'const ushort *' 2> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 错误与这行代码有关:QMessageBox::information(this, QString::fromUtf16(title), QString::fromUtf16(msg));让我再看一遍。
  • 您需要追溯您的步骤以找出您更改默认设置的原因。必须重新构建 Qt 库可能是必要的,但是正态分布可以做到这一点,因此您可能已经重新构建了它们并弄错了。如果您不修复它,这将继续受到伤害,wchar_t 在 Windows 上相当重要。
  • 不幸的是,将Treat WChar_t As Built in Type 设置为“是”不起作用。我仍然遇到相同的链接错误。
猜你喜欢
  • 2011-05-09
  • 1970-01-01
  • 2020-12-24
  • 2014-03-06
  • 2016-12-12
  • 1970-01-01
  • 2015-10-11
  • 2011-11-17
  • 2014-01-02
相关资源
最近更新 更多