首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未定义符号:运行时的_ZN7QString13toUtf8_helperERKS_

未定义符号:运行时的_ZN7QString13toUtf8_helperERKS_
EN

Stack Overflow用户
提问于 2014-12-31 00:11:25
回答 4查看 6.3K关注 0票数 5

我有两个项目使用Qt。一个是用QtCreator开发的,另一个是用eclipse开发的。它们都使用相同的QT5.3.1库,都是用GCC编译的。但是,当我运行处于eclipse中的程序时,它会与消息Undefined symbol: _ZN7QString13toUtf8_helperERKS_一起崩溃。

查找显示产生此错误的代码是

代码语言:javascript
复制
path.toStdString().c_str()     // path is a QString

而qstring.h .h中的确切位置是

代码语言:javascript
复制
#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QSTRING_COMPAT_CPP)
    QByteArray toLatin1() const & Q_REQUIRED_RESULT
    { return toLatin1_helper(*this); }
    QByteArray toLatin1() && Q_REQUIRED_RESULT
    { return toLatin1_helper_inplace(*this); }
    QByteArray toUtf8() const & Q_REQUIRED_RESULT
    { return toUtf8_helper(*this); } //                 <- here
    QByteArray toUtf8() && Q_REQUIRED_RESULT
    { return toUtf8_helper(*this); }
    QByteArray toLocal8Bit() const & Q_REQUIRED_RESULT
    { return toLocal8Bit_helper(constData(), size()); }
    QByteArray toLocal8Bit() && Q_REQUIRED_RESULT
    { return toLocal8Bit_helper(constData(), size()); }

在另一个项目中将QString转换为std::string (QtCreator中的一个)工作得很好。有什么问题吗?eclipse中缺少编译器选项吗?

编辑:来自两个项目的示例文件的编译器输出如下(我为可读性添加了换行符):

月食

代码语言:javascript
复制
Building file: ../src/mysource1.cpp
Invoking: GCC C++ Compiler
g++ -I"/home/username/myfolder/myproject1/src"
    -I"/home/username/myfolder/myproject1/src/dialogs"
    -I"/home/username/myfolder/myproject1/src/ignore"
    -I/usr/local/Qt-5.3.1/include -I/usr/local/Qt-5.3.1/include/QtCore
    -I/usr/local/Qt-5.3.1/include/QtGui -I/usr/local/Qt-5.3.1/include/QtWidgets
    -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -fPIE -MMD -MP
    -MF"src/mysource1.d" -MT"src/mysource1.d" -o "src/mysource1.o"
    "../src/mysource1.cpp"

QtCreator

代码语言:javascript
复制
g++ -c -pipe -g -Wall -W -D_REENTRANT -fPIE -DQT_WIDGETS_LIB -DQT_GUI_LIB
    -DQT_CORE_LIB -I/usr/local/Qt-5.3.1/mkspecs/linux-g++ -I../myproject2 
    -I../myproject2/src -I../myproject2/src/data -I../myproject2/src/dialogs 
    -I../myproject2/src/widgets -I../myproject2/src/widgets/overlays
    -I../myproject2/src/widgets/tools -I/usr/local/Qt-5.3.1/include
    -I/usr/local/Qt-5.3.1/include/QtWidgets -I/usr/local/Qt-5.3.1/include/QtGui
    -I/usr/local/Qt-5.3.1/include/QtCore -I. -I. -o mainwind.o
    ../myproject2/src/mainwind.cpp

Edit2:链接器输出如下:

月食

代码语言:javascript
复制
Invoking: GCC C++ Linker
g++ -L/usr/local/Qt-5.3.1/lib -o "myproject1" /*list of .o files*/
    -lQt5Core -lQt5Gui -lQt5Widgets -lgit2

QtCreator

代码语言:javascript
复制
g++ -Wl,-rpath,/usr/local/Qt-5.3.1/lib -o myproject2 /*list of .o files*/
    -L/usr/local/Qt-5.3.1/lib -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-06 05:10:44

qmake/cmake是该走的路。但是有趣的是,我们可以看到链接器是如何成功的,然后在运行过程中,我们得到了一个未定义的引用(不是一个不匹配的dll情况)。特别是在QT github repo中没有针对toUtf8_helper的预处理保护。再试一次。您能添加-DQT_COMPILING_QSTRING_COMPAT_CPP吗?这样,我们就可以在#else部件中使用与toUtf8()略有不同的路径,而不会调用缺少的toUtf8_helper方法。

原因:我认为这是因为 dll是使用一组预处理器标志生成的,而这些标志在您的项目构建过程中并不匹配。然后,您的代码中包含的头文件(如qstring.h ),它具有内联函数,并有预处理定义保护,就像在toStdString()期间调用的toUtf8()一样,将采用不同的路径。

还要注意的是,尝试构建没有qmake/cmake文件的QT项目(如这个问题/答案)是不建议的,并且必然会在项目中造成更多的问题。

票数 7
EN

Stack Overflow用户

发布于 2015-01-03 20:04:26

Undefined symbol: _ZN7QString13toUtf8_helperERKS_可能是由以下原因引起的:

eclipse中的链接由于缺少-Wl,-rpath,/usr/local/Qt-5.3.1/libLD_LIBRARY_PATH而导致错误(过时的Qt库)。Eclipse构建环境不是作为QtCreator构建环境设置的。

您编写的ldd已经使用检查了应用程序的动态链接,但是您也应该添加缺少的链接器选项-Wl,-rpath,/usr/local/Qt-5.3.1/lib**in、eclipse。**

(另一种选择是使用LD_LIBRARY_PATH,但保持两种构建环境相同是合理的。与应用程序一样,ldd也受到LD_LIBRARY_PATH的影响。LD_LIBRARY_PATH可能无法正确导出?)

还添加编译器标志-D_REENTRANT -fPIE -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/local/Qt-5.3.1/mkspecs/linux-g++

票数 2
EN

Stack Overflow用户

发布于 2014-12-31 00:29:56

我假设您希望使用QString ().c_str()函数将QString.toStdString转换为const char *。这不是一种可靠的方法。我不知道文档是怎么说的,但是我试着使用这个函数获得文件位置,这给了我一些奇怪的东西。请检查const *是否与QString中的值相同。如果是这样的话,那么您有两个选择。

  1. 要么分两步完成。即QString().toStdString(),并在下一步将其转换为const char*。虽然它不干净,但它有效。(主要问题是要有“深拷贝”。当您将QString转换为std::string时,Qt创建一个临时对象并直接尝试读取这个临时object.With --这个方法,您将创建两个单独的对象。
  2. 使用QString().toAscii.constData()QString():toUtf8().constData() (更佳)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27714446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档