我正在尝试使用Momentics IDE 2.0创建一个BB10 cascades项目,我需要该项目使用GNU标准库而不是Dinkumware(因为我使用的arm-unknown-nto-qnx8.0.0eabi-g++
编译的外部库仅支持gnu std)。
在IDE中,我已经将项目属性->C/C++ Build/设置/运行时更改为“C++ GNU with exceptions”。然而,当我运行一个简单的项目并使用一个由我创建的静态库(.a文件)(只包含一个头文件、一个构造函数、一个std::string
对象、一个setter和getter(用于该对象)及其相应的cpp文件),执行以下操作时会出现分段错误:
testnamespace::testclass *object = new testnamespace::testclass();
std::string test = "Hello";
object->setText(test);
delete object;
我认为这个错误的原因是该库使用gnu std编译,而项目使用Dinkumware编译。我核对了包含路径,发现:
C:\bbndk\target_10_1_0_428\qnx6\usr\include
在之前包含
C:\bbndk\target_10_1_0_428\qnx6\usr\include\c++\4.6.3
此外,makefile中用于编译项目中cpp文件的命令为
qcc -Vgcc_ntoarmv7le
,而非qcc -V4.6.3,gcc_ntoarmv7le_gpp
(支持gnu stl标志)。
我是否做错了什么?是否缺少某些配置?
我真的需要在我的黑莓项目中使用GNU STD而不是Dinkumware,但我无法弄清楚如何实现。
编辑:
我对项目进行了一些更改,并解决了一些问题。
我将以下内容添加到我的.pro文件中
QMAKE_CXX = qcc -V4.6.3,gcc_ntoarmv7le_gpp
QMAKE_CC = qcc -V4.6.3,gcc_ntoarmv7le
QMAKE_LINK = qcc -V4.6.3,gcc_ntoarmv7le_gpp
QMAKE_AS = qcc -V4.6.3,gcc_ntoarmv7le_gpp
LIBS += -lc -lm -lcpp -lstdc++ -Bstatic ../libs/libteste.a -Bdynamic
当然,LIBS命令已经存在了,但我决定将它放在这里,以便您可以理解我是如何链接库的。
现在,我有以下代码:
testenamespace::TesteClass *temp = new testenamespace::TesteClass() ;
std::string teste = "Hello";
temp->setTesteString(teste);
QString qsr = QString::fromStdString(temp->getTesteString());
qDebug ("String in the object: "+qsr.toLatin1());
delete temp;
一切都运行良好,直到代码执行到
delete temp;
时,我收到以下输出:
启用了Qml调试。仅在安全环境中使用此功能!对象中的字符串:Hello 进程1173778674(test_bb10)已终止 SIGSEGV code=2 fltno=11 ip=0150ed7c(/usr/lib/ldqnx.so.2@_list_release+0x3c) mapaddr=0002ed7c。 ref=78362e2b
有时我也会得到以下输出:
启用了Qml调试。仅在安全环境中使用此功能!对象中的字符串:Hello free malloc object that is not allocated:../../dlist.c:1096**
我认为问题出在new
和delete
的调用上,也许处理器导入的标准库不是正确的。
提前感谢您的帮助。