c++ - 使用 toLatin1() 将 QString 转换为 QByteArray 会出现链接器错误

标签 c++ visual-studio qt

我正在 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/

相关文章:

c++ - 创建和显示位图

c++ - 模板友好语法

visual-studio - 我可以让 Visual Studio 2013 在文件保存时运行 Powershell 命令吗?

c++ - 如何为可编辑的 QComboBox 覆盖 KeyPressEvent?

c++ - 类左值仅成员函数与 shared_ptr

c++ - "using"定义成员函数和非成员函数时的关键字

ios - Visual Studio Xamarin 自动配置不起作用

c++ - 如何以编程方式检查 VC++ 中的 Internet 带宽?

c++ - 无法加载库 *.dll 未知错误 0x000000c1

python - 如何使用 PyQT5 附加和分离外部应用程序或停靠外部应用程序?