我正在 Visual Studio 2015 中开发一个简单的 Qt-5 控制台应用程序。我可以使用 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 方法。
最佳答案
链接器错误显示“损坏的”C++ 符号名称,其中包含已编码的类和参数。 C++ 符号名称修改没有标准,因此不同的编译器的做法有所不同。即使“相同”编译器的不同版本也可能会改变这一点(除其他外,没有标准的 C++ ABI),并且 Microsoft 已经在 Visual C++ 中多次这样做过。
因此,您使用的任何 C++ 库都必须使用相同的 C++ 编译器工具链(或兼容的编译器,但在 Windows 上有很多......不幸的多样性,这里)进行编译。
这也适用于 Qt。这就是为什么您会找到多个适用于 Windows 的 Qt 离线安装程序下载,以及在线安装程序显示如此多不同的 Qt 版本(版本号相同但工具链名称不同)的原因。如果您找到了为您想要使用的编译器预构建的 Qt,那就太棒了!安装它并快乐。
如果没有,您有两个选择:
- 使用您选择的编译器自行构建 Qt 库。这并不难,说明也很好,但在 Windows 上可能有点乏味,因为有一些先决条件,例如 Python,您需要单独获取它们。
- 切换编译器工具链,这样你就可以获得一个预先构建的 Qt 库(Qt Online 安装程序可以安装与 MinGW 的 Qt 库相匹配的 MinGW 工具链,如果你没有使用要求,这相当方便)其他的东西)。
关于c++ - 使用 toLatin1() 将 QString 转换为 QByteArray 会出现链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40243023/