Итак, вот что происходит (делая безопасное предположение, что вы используете Linux-дистрибутив в вашей виртуальной машине).
С этой тестовой программой:
#include <stdio.h>
#include <endian.h>
int main(void) {
printf("%d\n", le32toh(1234));
return 0;
}
Компиляция и запуск работает:
$ gcc -Wall -Wextra test.c
$ ./a.out
1234
Однако вы компилируете, используя -std=c99
. Итак, давайте попробуем это:
$ gcc -std=c99 -Wall -Wextra test.c
test.c: In function ‘main’:
test.c:5:18: warning: implicit declaration of function ‘le32toh’ [-Wimplicit-function-declaration]
printf("%d\n", le32toh(1234));
^~~~~~~
/tmp/cc7p3cO8.o: In function `main':
test.c:(.text+0xf): undefined reference to `le32toh'
collect2: error: ld returned 1 exit status
Компиляция в режиме c99
отключает набор функций и макросов и тому подобное, которых нет в версии стандарта C 1999 года, если они явно не запрошены, отсюда и неявное объявление объявления. le32toh()
- это макрос, а не функция с символом в libc, следовательно, ошибка компоновщика.
Если вы прочитаете справочную страницу для le32toh()
, вы увидите, что для нее требуется макрос проверки _DEFAULT_SOURCE
, который должен быть определен до включения любых заголовков .
Итак, ваши варианты:
- Вместо этого скомпилируйте в режиме
gnu99
, поскольку это автоматически определяет набор макросов тестирования возможностей.
- Продолжайте использовать режим
c99
и добавьте #define _DEFAULT_SOURCE
в самом начале вашего исходного файла fat32.c.
- Продолжайте использовать режим
c99
и добавьте -D_DEFAULT_SOURCE
к аргументам компилятора.