【发布时间】:2014-12-31 00:11:25
【问题描述】:
我有两个使用 Qt 的项目。一个是用 QtCreator 开发的,另一个是用 eclipse 开发的。两者都使用相同的 Qt 5.3.1 库,都使用 GCC 编译。但是,当我运行 Eclipse 中的程序时,它会崩溃并显示消息 Undefined symbol: _ZN7QString13toUtf8_helperERKS_。
查找显示产生此错误的代码是
path.toStdString().c_str() // path is a QString
qstring.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()); }
在另一个项目(QtCreator 中的那个)中将QString 转换为std::string 效果很好。可能是什么问题? 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.cpp
编辑2: 链接器输出如下:
日食
Invoking: GCC C++ Linker
g++ -L/usr/local/Qt-5.3.1/lib -o "myproject1" /*list of .o files*/
-lQt5Core -lQt5Gui -lQt5Widgets -lgit2
QtCreator
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
【问题讨论】:
-
我不确定,所以我会写评论而不是回答。当带有这些符号的源文件不包含在编译的源文件中时,会引发未定义符号错误。
-
@fnc12 我不确定我是否理解正确:
QString::toUtfHelper的符号出现在源头文件中,但不在编译库中?但我使用的是由make install复制到/usr/local/Qt-5.3.1的源文件,以及位于同一文件夹中的库(我使用ldd进行了检查)。这里怎么会出现矛盾?此外,另一个项目使用相同的文件没有错误。 -
使用 Qt 静态库还是动态库?
-
只是随机尝试 - Qt 是使用一组预处理器定义构建的(无论您构建还是预构建)。如果在 QtCreator/Eclipse 中没有使用相同的预处理器定义集,那么这将意味着 Eclipse 中包含的 Qt 头文件略有不同(假设任何函数声明都被预处理器保护)。这会影响 vtables 指针。您能否确保在 Eclipse 和 QtCreator 中使用相同的预处理器定义。希望您可以从构建消息中确认。
-
@Kiran 如何在 QtCreator 中查看预处理器定义?我没有在eclipse中列出。但是,QtCreator 使用 qmake,也许 qmake 有某种内置的预处理器设置?