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

来源:互联网 发布:linux sleep函数没动作 编辑:程序博客网 时间:2024/05/18 02:08

             把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"));)。


0 0
原创粉丝点击