使用toLatin1()将QString转换为QByteArray会产生链接器错误

时间:2016-10-25 14:45:58

标签: c++ visual-studio qt

我有一个简单的Qt-5控制台应用程序,我在Visual Studio 2015中开发。我可以使用QS对象,如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方法没有问题。

2 个答案:

答案 0 :(得分:2)

链接器错误显示"损坏的" C ++符号名称,包含编码的类和参数。 C ++符号名称修改没有标准,因此不同的编译器会以不同的方式执行。甚至不同版本的"相同"编译器可能会改变它(除此之外,没有标准的C ++ ABI),并且Microsoft已经使用Visual C ++多次完成此操作。

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

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

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

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

答案 1 :(得分:0)

正如hyde所建议的那样,这与我使用的Qt库和我的Visual Studio版本之间的不匹配。对于VS2015,我必须访问Qt网站上的All Downloads页面,并专门使用Qt 5.7.0 for Windows(VS 2015)。

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