gcc cc1: не хватает памяти

Я пытаюсь скомпилировать исходный код в моем BeagleBoard с помощью Angstrom Linux. Вчера я смог скомпилировать свой код. Но сегодня я не могу скомпилировать код, и он говорит:

ccl: out of memory allocating 268439608 bytes after a total of 405504 bytes
make *** [getimagefromcam1.o] Error 1

Моя строка компиляции:

gcc getimagefromcam1.c `pkg-config --cflags --libs opencv` -o getimagefromcam1 -lpthread

Код:

#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
#include <stdio.h>

int main(int argc, char* argv[])
{    
  CvCapture* camera = cvCreateCameraCapture(0); // Use the default camera

  IplImage*     frame = 0;
  IplImage      img;

  cvSetCaptureProperty(camera,CV_CAP_PROP_FRAME_WIDTH,2016) ;
  cvSetCaptureProperty(camera,CV_CAP_PROP_FRAME_HEIGHT,1512); 

  frame = cvQueryFrame(camera); //need to capture at least one extra frame
  frame = cvQueryFrame(camera);

  if (frame != NULL) {
    printf("got frame 1\n\r");
        cvSaveImage("webcam1.jpg", frame,0);
  } else {
      printf("Null frame 1\n\r");
  }

    frame = cvQueryFrame(camera); //need to capture at least one extra frame
  frame = cvQueryFrame(camera);

  if (frame != NULL) {
    printf("got frame 1\n\r");
        cvSaveImage("webcam1.jpg", frame,0);
  } else {
      printf("Null frame 1\n\r");
  }
  cvReleaseCapture(&camera);
  return 0;
}

когда я пишу "бесплатно" это говорит

 total       used       free     shared    buffers     cached
Mem:        241260     221256      20004          0      13748     116184
-/+ buffers/cache:      91324     149936
Swap:            0          0          0

Как я могу это решить?


person user1336117    schedule 02.07.2012    source источник
comment
Какую версию gcc вы используете? Попробуйте обновиться до последней версии (например, 4.7 или хотя бы 4.6).   -  person Basile Starynkevitch    schedule 02.07.2012


Ответы (1)


У тебя явно не хватает памяти (268439 > 221256). Теперь у вас есть два варианта:

  1. Создайте временный файл подкачки, подобный этому. Это сводится к:

    su - root
    # for one GB of swap
    dd if=/dev/zero of=tmpswap bs=1024 count=1M
    mkswap tmpswap
    swapon tmpswap
    

    Я бы выбрал этот способ как быстрое решение, не говоря уже о том, что вам действительно нужно немного подкачки с таким небольшим объемом памяти.

    Прочтите статью, если вы хотите сделать это изменение постоянным, в нем есть несколько ценных советов относительно разрешений и fstab.

  2. Попробуйте упростить свой код, чтобы cc1 не требовалось столько памяти. Хотя понятия не имею, как это сделать.

person Jonas Schäfer    schedule 02.07.2012
comment
Это решено, но здесь я вижу новую ошибку: попытка доступа за пределы устройства mmcblk0p2: rw=0, want=34359738368, limit=15433728 попытка доступа за пределы устройства mmcblk0p2: rw=0, want=34359738368, limit=15433728 - person user1336117; 02.07.2012
comment
Звучит не очень хорошо, но я не знаю, откуда могла взяться шляпа. - person Jonas Schäfer; 02.07.2012
comment
Я бы предложил использовать fallocate вместо dd, так как это значительно быстрее: fallocate -l 1G tmpswap - person askvictor; 18.05.2016
comment
@askvictor О, хорошо, я этого не знал. Я знаю, что truncate не работает, потому что создает разреженный файл, который swapon не нравится (по понятным причинам). Будет редактировать. - person Jonas Schäfer; 18.05.2016
comment
Совет по поводу fallocate неверен: unix.stackexchange.com/a/294605/229227 - person Sauron; 23.09.2018
comment
@ Саурон Действительно. Исправлено. - person Jonas Schäfer; 23.09.2018