【问题标题】:Converting QString to QByteArray using toLatin1() gives a linker error使用 toLatin1() 将 QString 转换为 QByteArray 会导致链接器错误
【发布时间】:2017-03-07 16:23:45
【问题描述】:

我有一个简单的 Qt-5 控制台应用程序,正在 Visual Studio 2015 中开发。我可以使用 Qt 对象,例如 QStrings,所以我确定 Qt 安装正确,但我需要将 QString 转换为 char*所以我可以将它传递给一个库函数。

我关注了这个答案:QString to char* conversion

所以我现在有如下代码:

QString myStr = "SomeString";
QByteArray ba = myStr.toLatin1();
const char *c_str = ba.data();

但是当我构建解决方案时,我收到以下错误:

Error   LNK2019 unresolved external symbol "__declspec(dllimport) public: class QByteArray __thiscall QString::toLatin1(void)const & " (__imp_?toLatin1@QString@@QGBE?AVQByteArray@@XZ) referenced in function _main    

问题似乎是 toLatin1() 调用,但我不知道为什么链接器找不到它,特别是因为我可以毫无问题地使用其他 QString 方法。

【问题讨论】:

  • 这可能是编译器工具链和 Qt 库不匹配的情况。
  • 啊。看起来我有一个为 Vis Studio 2013 编译的 Qt 版本。我会尝试更新它,看看是否有帮助。

标签: c++ visual-studio qt


【解决方案1】:

链接器错误显示“损坏”的 C++ 符号名称,其中包含已编码的类和参数。 C++ 符号名称修饰没有标准,因此不同的编译器会采用不同的方式。即使是不同版本的“相同”编译器也可能会改变这一点(除此之外,没有标准的 C++ ABI),微软已经用 Visual C++ 多次做到这一点。

因此,您使用的任何 C++ 库都必须使用相同的 C++ 编译器工具链(或兼容的编译器,但在 Windows 上存在很多......不幸的多样性,在这里)。

这也适用于 Qt。这就是为什么你会发现有几个 Windows 的 Qt 离线安装程序下载,以及为什么在线安装程序会显示这么多不同的 Qt 版本,它们具有相同的版本号但不同的工具链名称。如果您为要使用的编译器找到预构建的 Qt,那就太好了!安装它并快乐。

如果没有,您有两个选择:

  • 使用您选择的编译器自己构建 Qt 库。这并不难,说明很好,但在 Windows 上可能有点乏味,因为有一些先决条件,如 Python,需要单独获取。
  • 切换编译器工具链,这样你就可以得到一个预构建的 Qt 库(Qt Online 安装程序可以安装与 MinGW 的 Qt 库匹配的 MinGW 工具链,如果你没有使用要求,这相当方便别的东西)。

【讨论】:

  • 感谢您的详细解释
【解决方案2】:

正如 hyde 所建议的,结果证明这是我使用的 Qt 库与我的 Visual Studio 版本之间的不匹配。对于 VS2015,我必须访问 Qt 网站上的所有下载页面,并专门使用 Qt 5.7.0 for Windows (VS 2015)。

更新我在项目设置中使用的 Qt 版本消除了链接器错误。

【讨论】:

    猜你喜欢
    • 2011-08-03
    • 2015-05-20
    • 1970-01-01
    • 2012-07-02
    • 2017-08-31
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多