honami520 发表于 2018-11-26 03:23:50

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的给点提示。

john78 发表于 2018-11-26 06:02:01

很有可能内存溢出。只有中间加打印信息。一步一步查

nanfang2000 发表于 2018-11-26 08:39:00

感觉像是so文件版本不对。或者就是你把debug版本和release版本搞错了

wye11083 发表于 2018-11-26 08:48:41

john78 发表于 2018-11-26 06:02
很有可能内存溢出。只有中间加打印信息。一步一步查

是的。qt自己就得用掉几百mb内存,而路由器撑死也只有128mb而已。

hexenzhou 发表于 2018-11-26 09:15:27

需要把整个Qt交叉编译后的库拷贝到板子上,有百来兆呢

honami520 发表于 2018-11-26 09:43:11

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写应用,那就麻烦了。有没有一些比较好的方式去做。

wye11083 发表于 2018-11-26 09:54:07

honami520 发表于 2018-11-26 09:43
是的,内存总共64M,系统已经用掉了30M了。
由于FLASH也只有32M,所以之前是把libqt5core.so放到sd卡里面 ...

干吗非得用qt,直接裸c++不得了。

XIVN1987 发表于 2018-11-26 09:55:46

openwrt一般资源都比较小,,Qt恐怕跑起来吃力

如果界面比较简单的话,不如在openwrt里跑个web server,,PC、手机浏览器里看界面

honami520 发表于 2018-11-26 10:15:05

XIVN1987 发表于 2018-11-26 09:55
openwrt一般资源都比较小,,Qt恐怕跑起来吃力

如果界面比较简单的话,不如在openwrt里跑个web server,, ...

我的程序其实没有界面。
之前的程序是用Qt做的。用了串口,有一个http server。再就是用了Qt的一些内部特性,好比线程,还有信号于槽。
这个程序之前在全志A20上面运行的,现在换平台想移植到openwrt上面。结果发现被坑了。
这要是不能直接跑就麻烦了。重新用c,c++做,动作就大了。

abutter 发表于 2018-11-26 10:24:45

本帖最后由 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:35:50

本帖最后由 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的

honami520 发表于 2018-11-26 14:13:52

暂时没有特别好的办法,刚刚试着编译了一个Qt4.8.7,去掉了各种不需要的特性。这次出来的so文件尺寸小了许多。core.so库才2.8MB,晚上实验下看看能不能跑起来。
如果能跑起来就方便了。
否则的话就要对代码动大手术了。

jameszxj 发表于 2018-11-26 14:33:12

没有界面还是想办法别用Qt了吧,Qt还是比较耗费资源的。

huangqi412 发表于 2018-11-26 21:54:51

honami520 发表于 2018-11-26 14:13
暂时没有特别好的办法,刚刚试着编译了一个Qt4.8.7,去掉了各种不需要的特性。这次出来的so文件尺寸小了许 ...

路由器资源太少了

fchen2 发表于 2018-11-26 22:50:41

Qt一般用的是glibc, MT7628用的是uclibc? 好像没有MMU

jordonwu 发表于 2018-11-27 02:44:31

honami520 发表于 2018-11-26 14:13
暂时没有特别好的办法,刚刚试着编译了一个Qt4.8.7,去掉了各种不需要的特性。这次出来的so文件尺寸小了许 ...

你要是做产品的话,这个配置跑QT悬

jordonwu 发表于 2018-11-27 02:51:19

Qt Lite 试试

honami520 发表于 2018-11-27 09:34:14

jordonwu 发表于 2018-11-27 02:51
Qt Lite 试试

4.8.7的还是要比5小很多。估计就算上QT LITE,也还是比4大。算了,我就这么用了,反正其实我也不用它的GUI,只是之前的程序是基于Qt的。
现在改起来就方便些。

abutter 发表于 2018-11-27 09:58:00

jordonwu 发表于 2018-11-27 02:51
Qt Lite 试试

Qt Lite 有资料码?搜索了一下,似乎不太多。

abutter 发表于 2018-11-27 10:03:42

abutter 发表于 2018-11-27 09:58
Qt Lite 有资料码?搜索了一下,似乎不太多。

似乎只是 feature 删减,整理的更模块化了。
不好意思。

gonboy 发表于 2018-11-29 08:50:47

openwrt 本身是无界面系统,小系统专用,功耗模式专用。 上Qt 是不合适的。 另不知道你的平台是啥? 7161 ?? 如果是的话,就不要浪费你的生命了。
用简单的C++ 重写,都比你移植快!

honami520 发表于 2018-11-29 10:23:45

gonboy 发表于 2018-11-29 08:50
openwrt 本身是无界面系统,小系统专用,功耗模式专用。 上Qt 是不合适的。 另不知道你的平台是啥? 7161 ?? ...

嗯,用的7628,widora BIT5平台。qt4.8.7已经OK了。现在正在慢慢的移植中。程序太大了,前面的程序写了2年多,随意的重写影响太大了。

gonboy 发表于 2018-11-30 08:46:38

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 才有可玩性

麦田有怪圈 发表于 2018-11-30 09:41:30

各位大佬,openwart跑Java是否可行

wx-ta 发表于 2018-11-30 15:19:08

其实可以先不讨论7628上QT合理性的问题。
核心放在重点上,为什么多个so会有segment fault,楼主不加载serial的时候内存占用多大,加载了会后还有多少内存,是不是malloc申请不到了或者栈空间太小了

vtte 发表于 2018-11-30 15:27:57

就是放在外置存储上的原因,你拷贝到内置存储或者/tmp就可以了。

honami520 发表于 2018-11-30 15:52:41

vtte 发表于 2018-11-30 15:27
就是放在外置存储上的原因,你拷贝到内置存储或者/tmp就可以了。

我后来换到内置上面就好了。
但是这就奇了怪了。SD卡理论上速度比W25XXX速度更快啊。SO加载到内存里面。
为什么会出现问题。SO加载是怎么样的呢?
内存的话都是8-9MB吧。好像有一些被catch了

lubing521 发表于 2018-12-1 15:52:34

honami520 发表于 2018-11-30 15:52
我后来换到内置上面就好了。
但是这就奇了怪了。SD卡理论上速度比W25XXX速度更快啊。SO加载到内存里面。
...

可以试试静态编译。

xycfwrj 发表于 2018-12-1 23:26:46

V3s荔枝派ddr容量差不多,我qt写界面跑20fps的vga动画也没事,还是检查qt本身的问题吧

vtte 发表于 2018-12-2 20:20:17

honami520 发表于 2018-11-30 15:52
我后来换到内置上面就好了。
但是这就奇了怪了。SD卡理论上速度比W25XXX速度更快啊。SO加载到内存里面。
...

不是速度的原因,我以前遇到过,但最终也没有找到原因。

redworlf007 发表于 2021-11-22 19:30:15

crazydtone 发表于 2018-11-26 10:35
我用的Hi-link的HLK7688A模块,32MB FLash, 128MB ram,里面跑了基于goahead的webserver,杠杠的。
用C ...

golang的程序要在mt7688上跑,编译配置要设置成mips架构吧?还有大小端也要设置吧?
页: [1]
查看完整版本: openwrt中运行Qt程序会出现Segmentation fault,有没有解决办法