您的位置:首页 > 运维架构 > Linux

linux下由于内存不足造成的 virtual memory exhausted: Cannot allocate memory, qt **.o文件 file not found

2014-01-11 15:07 1036 查看
把windows下的Qt程序移植到arm板上,在ubuntu下编译的时候,res.qrc文件不能生成qrc_res.o文件,搞了半天原来是qrc文件里有的图片路径含有中文,把中文去掉就OK了!

后来发现还是不行,修改qrc文件保存的时候还qt还会崩溃, 总结原因是我在添加资源文件的时候qt creator 崩溃造成的问题,把新添加的资源文件删除,再重新添加一次就好了!或者qrc文件在打开状态,把这个文件关闭了再编译.

而造成Qt崩溃的原因则是单个qrc文件里放了太多的资源文件,因此多添加几个qrc文件,免得qt 频频崩溃.之前资源文件可以说是乱放的,现在也借此机会把资源都放放好.顺便总结一下qrc文件的使用.在pro文件下的Resources文件夹里放入qrc文件,再新建几个要用到的目录,比如qss,image.

终于找到原因了,原来是内存不足.

18:12:18: Starting: "/usr/bin/make" -w

make: Entering directory `/home/ls/nfs/MyApp1.3.2.14-linux-1.16/NVR3000E_linux_1-build-desktop-Qt_4_8_4__qt___2__Debug'

/opt/qt/bin/rcc -name res ../NVR3000E/res.qrc -o qrc_res.cpp

/opt/hisi-linux-nptl/arm-hisiv100-linux/target/bin/arm-hisiv100nptl-linux-g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_XML_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED -I/opt/qt/mkspecs/qws/linux-arm-g++ -I../NVR3000E -I/opt/qt/include/QtCore -I/opt/qt/include/QtNetwork
-I/opt/qt/include/QtGui -I/opt/qt/include/QtXml -I/opt/qt/include -I../NVR3000E -I/home/ls/nfs/MyApp1.3.2.14-linux-1.16/NVR3000E/../../EXE/Debug -I. -I. -I. -o qrc_res.o qrc_res.cpp

virtual memory exhausted: Cannot allocate memory

make: *** [qrc_res.o] Error 1

make: Leaving directory `/home/ls/nfs/MyApp1.3.2.14-linux-1.16/NVR3000E_linux_1-build-desktop-Qt_4_8_4__qt___2__Debug'

18:12:24: The process "/usr/bin/make" exited with code 2.

Error while building project NVR3000E_linux_1.3.2.14 (target: Desktop)

When executing build step 'Make'

虚拟机里只分配了1G内存,交换空间(虚拟内存)为0,也没有多余的未分配空间了.所以利用 鸟哥的linux私房菜 上(第8章290页左右)的方法建了一个大文件用作swap用.

1. 用dd 命令建一个大文件

dd if=/dev/zero of=/slq/swap bs=1M count=4084

每个块1M,4084个块

root@ubuntu:/slq# dd if=/dev/zero of=/slq/swap bs=1M count=4084

^C2828+0 records in

2828+0 records out

2965372928 bytes (3.0 GB) copied, 10.2894 s, 288 MB/s

不过结果写出的文件大概3.0GB,不知道什么原因.鸟书上这样说

我的内核版本

root@ubuntu:/slq# uname -r

3.2.0-43-generic-pae

看来swap没了2G的限制,但是单个文件不能超出3G,一个swap也超不过3G了.
2. 使用 mkswap 将 /slq/swap 这个文件格式化为 swap 的文件格式:

mkswap /slq/swap

root@ubuntu:/slq# mkswap /slq/swap

Setting up swapspace version 1, size = 2895868 KiB

no label, UUID=760a6a23-ae97-4aa9-a1d8-aaa5126eba36

3. 使用swapon来将 /slq/swap 启动

swapon /slq/swap

这样就完成了

root@ubuntu:/slq# free -t

total used free shared buffers cached

Mem: 1024780 940808 83972 0 4580 322040

-/+ buffers/cache: 614188 410592

Swap: 2895868 0 2895868

Total: 3920648 940808 2979840





现在内存一共将近4G,肯定够用了.突然发现之前1G内存用了940M,我说怎么会一编译qt就自动退出了.

鸟书里的这样写

使用档案建置 swap

如果是在实体分割槽无法支持的环境下,此时前一小节提到的 loop 装置建置方法就派的上用场啦! 与

实体分割槽不一样的只是利用 dd 去建置一个大档案而已。多说无益,我们就再透过档案建置的方法建

立一个 128 MB 癿内存置换空间吧!

 1. 使用 dd 这个挃令来新增一个 128MB 癿档案在 /tmp 底下:

[root@www ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=128

128+0 records in

128+0 records out

134217728 bytes (134 MB) copied, 1.7066 seconds, 78.6 MB/s

[root@www ~]# ll -h /tmp/swap

-rw-r--r-- 1 root root 128M Oct 28 15:33 /tmp/swap

这样一个 128MB 癿档案就建置妥当。若忘记上述癿各顷参数癿意丿,请回前一小节查阅一下啰!

 2. 使用 mkswap 将 /tmp/swap 这个文件格式化为 swap 癿文件格式:

[root@www ~]# mkswap /tmp/swap

Setting up swapspace version 1, size = 134213 kB

# 这个挃令下达时请『特别小心』,因为下错字元控制,将可能使您癿文件系统

挂掉!

 3. 使用 swapon 来将 /tmp/swap 吪劢啰!

[root@www ~]# free

total used free shared buffers cached

Mem: 742664 450860 291804 0 45584 261284

-/+ buffers/cache: 143992 598672

Swap: 1277088 96 1276992

[root@www ~]# swapon /tmp/swap

[root@www ~]# free

total used free shared buffers cached

Mem: 742664 450860 291804 0 45604 261284

-/+ buffers/cache: 143972 598692

Swap: 1408152 96 1408056

[root@www ~]# swapon -s

Filename Type Size Used Priority

/dev/hdc5 partition 1020088 96 -1

/dev/hdc7 partition 257000 0 -2

/tmp/swap file 131064 0 -3


qrc是一个xml格式的资源配置文件,与应用程序关联的应用程序由 .qrc 文件来指定,它用XML记录硬盘上的文件和对应的随意指定的资源名称,应用程序通过资源名称来访问资源。
指定的路径是 .qrc 文件所在目录的相对路径。注意,列出的资源文件必须位于 .qrc 文件所在目录或者其子目录下。
图标文件需要与qrc文件位于同一目录下或者在该目录的子目录中。另外,如果qrc文件中使用了前缀(例如<qresource prefix="/myresources">),要确保图标路径正确无误;使用Qt designer添加图标文件时就是自动使用前缀/new/prefix的,但是该路径默认不存在。
应用程序中,绝大多数地方都可以用资源路径代替原始文件系统路径。尤其是在 QIcon, QImage,
or QPixmap 构造器中可以传递资源路径来代替文件名称:
cutAct =new QAction(QIcon(":/images/cut.png"), tr("Cu&t"),this);

在QtCreater中创建qrc文件的方法:
添加新文件—Qt—Qt资源文件
可以使用多种方法对其进行编辑,在资源编辑器中编辑时,首先要设置一个前缀,即在该qrc文件下的相对路径,如果与该qrc文件在相同的文件夹中,就只需要将前缀设为/即可。然后将设置的路径下自己需要的文件添加进来,在引用的时候只需要使用:符号即可(例如newAction->setIcon(QIcon(":/filenew.png"));)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: