openwrt中运行Qt程序会出现Segmentation fault,有没有解决办法
最近玩widora的MT7628开发板。板子上面跑的openwrt,是个MIPS芯片。按照网上的各种方法终于把Qt5.3.2交叉编译成功了。
然后在Qt上面交叉编译了一个简单的后台例子,只有一句话打印hello world.
放到板子上面运行,报错,提示需要libQt5Core.so.5。
然后把交叉编译的Qt库里面的libQt5Core.so.5.3.2放到/lib目录下面,之后建立了一个快捷方式libQt5Core.so.5。
之后再运行就不报这个错误了,报了Segmentation fault这个错误就终止了。
奇怪的是,我坚持继续执行程序2次,中间有segmentation fault,也有bus error。
但是最终,程序竟然就运行起来了,正常的打印了hello world。
这就太诡异了,为什么会出现这样的情况,难道是一开始某些内容在内存里面没有准备好,程序运行得太“仓促”,多运行几次最后就准备好了,然后就能每次正常执行。
直到板子重启后,就又会变回去。
不知道有没有人玩openwrt或者widora,在上面跑过Qt的给点提示。
很有可能内存溢出。只有中间加打印信息。一步一步查 感觉像是so文件版本不对。或者就是你把debug版本和release版本搞错了 john78 发表于 2018-11-26 06:02
很有可能内存溢出。只有中间加打印信息。一步一步查
是的。qt自己就得用掉几百mb内存,而路由器撑死也只有128mb而已。 需要把整个Qt交叉编译后的库拷贝到板子上,有百来兆呢 wye11083 发表于 2018-11-26 08:48
是的。qt自己就得用掉几百mb内存,而路由器撑死也只有128mb而已。
是的,内存总共64M,系统已经用掉了30M了。
由于FLASH也只有32M,所以之前是把libqt5core.so放到sd卡里面的。
昨天把sd卡去掉。把库放到flash的/lib里面后,程序可以启动了,每次都能正常启动。
但是增加了一个serialport的so之后。又会出segment了。
现在看来,flash或者内存对Qt加载运行都有影响。
第一次在这么小内存,flash上面跑qt,没想到遇到这么奇怪的问题。
以前在很多平台跑都很正常。
另外问下,linux下不用Qt写应用,那就麻烦了。有没有一些比较好的方式去做。 honami520 发表于 2018-11-26 09:43
是的,内存总共64M,系统已经用掉了30M了。
由于FLASH也只有32M,所以之前是把libqt5core.so放到sd卡里面 ...
干吗非得用qt,直接裸c++不得了。 openwrt一般资源都比较小,,Qt恐怕跑起来吃力
如果界面比较简单的话,不如在openwrt里跑个web server,,PC、手机浏览器里看界面 XIVN1987 发表于 2018-11-26 09:55
openwrt一般资源都比较小,,Qt恐怕跑起来吃力
如果界面比较简单的话,不如在openwrt里跑个web server,, ...
我的程序其实没有界面。
之前的程序是用Qt做的。用了串口,有一个http server。再就是用了Qt的一些内部特性,好比线程,还有信号于槽。
这个程序之前在全志A20上面运行的,现在换平台想移植到openwrt上面。结果发现被坑了。
这要是不能直接跑就麻烦了。重新用c,c++做,动作就大了。 本帖最后由 abutter 于 2018-11-26 10:40 编辑
可以用 strace 看看是怎么回事。
或者尝试一下 www.kdab.com/qt-quick-without-a-gpu-i-mx6-ull 去掉一些不必要的库。
如果 Qt 实在不行,golang 可以考虑一下。 本帖最后由 crazydtone 于 2018-11-26 10:37 编辑
honami520 发表于 2018-11-26 09:43
是的,内存总共64M,系统已经用掉了30M了。
由于FLASH也只有32M,所以之前是把libqt5core.so放到sd卡里面 ...
我用的Hi-link的HLK7688A模块,32MB FLash, 128MB ram,里面跑了基于goahead的webserver,杠杠的。
用C的
暂时没有特别好的办法,刚刚试着编译了一个Qt4.8.7,去掉了各种不需要的特性。这次出来的so文件尺寸小了许多。core.so库才2.8MB,晚上实验下看看能不能跑起来。
如果能跑起来就方便了。
否则的话就要对代码动大手术了。 没有界面还是想办法别用Qt了吧,Qt还是比较耗费资源的。 honami520 发表于 2018-11-26 14:13
暂时没有特别好的办法,刚刚试着编译了一个Qt4.8.7,去掉了各种不需要的特性。这次出来的so文件尺寸小了许 ...
路由器资源太少了 Qt一般用的是glibc, MT7628用的是uclibc? 好像没有MMU honami520 发表于 2018-11-26 14:13
暂时没有特别好的办法,刚刚试着编译了一个Qt4.8.7,去掉了各种不需要的特性。这次出来的so文件尺寸小了许 ...
你要是做产品的话,这个配置跑QT悬 Qt Lite 试试 jordonwu 发表于 2018-11-27 02:51
Qt Lite 试试
4.8.7的还是要比5小很多。估计就算上QT LITE,也还是比4大。算了,我就这么用了,反正其实我也不用它的GUI,只是之前的程序是基于Qt的。
现在改起来就方便些。 jordonwu 发表于 2018-11-27 02:51
Qt Lite 试试
Qt Lite 有资料码?搜索了一下,似乎不太多。 abutter 发表于 2018-11-27 09:58
Qt Lite 有资料码?搜索了一下,似乎不太多。
似乎只是 feature 删减,整理的更模块化了。
不好意思。 openwrt 本身是无界面系统,小系统专用,功耗模式专用。 上Qt 是不合适的。 另不知道你的平台是啥? 7161 ?? 如果是的话,就不要浪费你的生命了。
用简单的C++ 重写,都比你移植快! gonboy 发表于 2018-11-29 08:50
openwrt 本身是无界面系统,小系统专用,功耗模式专用。 上Qt 是不合适的。 另不知道你的平台是啥? 7161 ?? ...
嗯,用的7628,widora BIT5平台。qt4.8.7已经OK了。现在正在慢慢的移植中。程序太大了,前面的程序写了2年多,随意的重写影响太大了。 honami520 发表于 2018-11-29 10:23
嗯,用的7628,widora BIT5平台。qt4.8.7已经OK了。现在正在慢慢的移植中。程序太大了,前面的程序写了2 ...
BIT5金手指:MT7628DAN FLASH 16/32MB RAM:64MB
如果没改RAM的话。只能说是自己找麻烦。 就算你加上了swap, 又能提高多少。
RAM >=512M 才有可玩性 各位大佬,openwart跑Java是否可行 其实可以先不讨论7628上QT合理性的问题。
核心放在重点上,为什么多个so会有segment fault,楼主不加载serial的时候内存占用多大,加载了会后还有多少内存,是不是malloc申请不到了或者栈空间太小了 就是放在外置存储上的原因,你拷贝到内置存储或者/tmp就可以了。 vtte 发表于 2018-11-30 15:27
就是放在外置存储上的原因,你拷贝到内置存储或者/tmp就可以了。
我后来换到内置上面就好了。
但是这就奇了怪了。SD卡理论上速度比W25XXX速度更快啊。SO加载到内存里面。
为什么会出现问题。SO加载是怎么样的呢?
内存的话都是8-9MB吧。好像有一些被catch了 honami520 发表于 2018-11-30 15:52
我后来换到内置上面就好了。
但是这就奇了怪了。SD卡理论上速度比W25XXX速度更快啊。SO加载到内存里面。
...
可以试试静态编译。 V3s荔枝派ddr容量差不多,我qt写界面跑20fps的vga动画也没事,还是检查qt本身的问题吧 honami520 发表于 2018-11-30 15:52
我后来换到内置上面就好了。
但是这就奇了怪了。SD卡理论上速度比W25XXX速度更快啊。SO加载到内存里面。
...
不是速度的原因,我以前遇到过,但最终也没有找到原因。 crazydtone 发表于 2018-11-26 10:35
我用的Hi-link的HLK7688A模块,32MB FLash, 128MB ram,里面跑了基于goahead的webserver,杠杠的。
用C ...
golang的程序要在mt7688上跑,编译配置要设置成mips架构吧?还有大小端也要设置吧?
页:
[1]