我有两个项目使用Qt。一个是用QtCreator开发的,另一个是用eclipse开发的。它们都使用相同的QT5.3.1库,都是用GCC编译的。但是,当我运行处于eclipse中的程序时,它会与消息Undefined symbol: _ZN7QString13toUtf8_helperERKS_一起崩溃。
查找显示产生此错误的代码是
path.toStdString().c_str() // path is a QString而qstring.h .h中的确切位置是
#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中缺少编译器选项吗?
编辑:来自两个项目的示例文件的编译器输出如下(我为可读性添加了换行符):
月食
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
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.cppEdit2:链接器输出如下:
月食
Invoking: GCC C++ Linker
g++ -L/usr/local/Qt-5.3.1/lib -o "myproject1" /*list of .o files*/
-lQt5Core -lQt5Gui -lQt5Widgets -lgit2QtCreator
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发布于 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项目(如这个问题/答案)是不建议的,并且必然会在项目中造成更多的问题。
发布于 2015-01-03 20:04:26
Undefined symbol: _ZN7QString13toUtf8_helperERKS_可能是由以下原因引起的:
eclipse中的链接由于缺少-Wl,-rpath,/usr/local/Qt-5.3.1/lib或LD_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++
发布于 2014-12-31 00:29:56
我假设您希望使用QString ().c_str()函数将QString.toStdString转换为const char *。这不是一种可靠的方法。我不知道文档是怎么说的,但是我试着使用这个函数获得文件位置,这给了我一些奇怪的东西。请检查const *是否与QString中的值相同。如果是这样的话,那么您有两个选择。
QString().toStdString(),并在下一步将其转换为const char*。虽然它不干净,但它有效。(主要问题是要有“深拷贝”。当您将QString转换为std::string时,Qt创建一个临时对象并直接尝试读取这个临时object.With --这个方法,您将创建两个单独的对象。QString().toAscii.constData()或QString():toUtf8().constData() (更佳)https://stackoverflow.com/questions/27714446
复制相似问题