Ошибка: неявное объявление функции 'g_slist_free_full'

Я пытаюсь скомпилировать некоторое программное обеспечение под названием libfprint. Я успешно скомпилировал его на другом компьютере, но теперь, в некоторых файлах, я получаю следующую ошибку:

tomselleck@ubuntuselleck:~/Documents/FingerBellProject/libfprint-0.5.0$ sudo make
[sudo] password for tomselleck: 
make  all-recursive
make[1]: Entering directory `/home/tomselleck/Documents/FingerBellProject/libfprint-0.5.0'
Making all in libfprint
make[2]: Entering directory `/home/tomselleck/Documents/FingerBellProject/libfprint-0.5.0/libfprint'
  CC       libfprint_la-aes1610.lo
drivers/aes1610.c: In function 'capture_read_strip_cb':
drivers/aes1610.c:619: error: implicit declaration of function 'g_slist_free_full'
make[2]: *** [libfprint_la-aes1610.lo] Error 1
make[2]: Leaving directory `/home/tomselleck/Documents/FingerBellProject/libfprint-0.5.0/libfprint'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/tomselleck/Documents/FingerBellProject/libfprint-0.5.0'
make: *** [all] Error 2

Есть идеи? Спасибо!

редактировать

Я опубликую пример строки, в которой выдается ошибка:

    /* stop capturing if MAX_FRAMES is reached */
    if (aesdev->blanks_count > 10 || g_slist_length(aesdev->strips) >= MAX_FRAMES) {
        struct fp_img *img;

        fp_dbg("sending stop capture.... blanks=%d  frames=%d", aesdev->blanks_count, g_slist_length(aesdev->strips));
        /* send stop capture bits */
        aes_write_regv(dev, capture_stop, G_N_ELEMENTS(capture_stop), stub_capture_stop_cb, NULL);
        aesdev->strips = g_slist_reverse(aesdev->strips);
        img = aes_assemble(aesdev->strips, aesdev->strips_len,
            FRAME_WIDTH, FRAME_HEIGHT);

        g_slist_free_full(aesdev->strips, g_free);<---- Error here

        aesdev->strips = NULL;
        aesdev->strips_len = 0;
        aesdev->blanks_count = 0;
        fpi_imgdev_image_captured(dev, img);
        fpi_imgdev_report_finger_status(dev, FALSE);
        /* marking machine complete will re-trigger finger detection loop */
        fpi_ssm_mark_completed(ssm);
        /* Acquisition finished: restore default gain values */
        restore_gain();
    } else {
        /* obtain next strip */
        fpi_ssm_jump_to_state(ssm, CAPTURE_REQUEST_STRIP);
    }

out:
    g_free(data);
    libusb_free_transfer(transfer);
}

2 ответа

Решение

Это происходит когда

  • первое использование функции предшествует ее определению,
  • нет прототипа для функции, или
  • требуемый заголовочный файл отсутствует.

Убедитесь, что в тексте или в заголовке есть прототип, или переместите функцию в начало файла перед его первым использованием.

... также (в скобках) не работает make как корень, с sudo. Это отчасти потому, что можно представить, что во время сборки что-то ломается, что топает по чему-то важному (что не было бы root), а также по общему принципу, что хорошо быть пользователем root как можно меньше.

Если вы действительно устанавливаете что-то в системном расположении, например /usr/localпострой как сам, то делай make -n install и проверьте, что и где будет установлено (при условии, что у объекта, который вы собираете, есть цель установки). Если все выглядит хорошо, только потом sudo make install,

Другие вопросы по тегам