Неопределенная ссылка на ошибку `le16toh'в Makefile
Я пытаюсь скомпилировать C программу со следующим Makefile:
msh: libFAT32.so
gcc -Wall -fPIC -I. -o msh newTest.c -L. -lFAT32
libFAT32.so:
gcc -std=c99 -shared -o libFAT32.so -fPIC fat32.c
clean:
rm *.so msh
Однако каждый раз, когда я пытаюсь скомпилировать программу с помощью make, я получаю следующую ошибку:
user@user-VirtualBox:~/fat1$ make
gcc -Wall -fPIC -I. -o msh newTest.c -L. -lFAT32
./libFAT32.so: undefined reference to `le32toh'
./libFAT32.so: undefined reference to `le16toh'
collect2: error: ld returned 1 exit status
Makefile:19: recipe for target 'msh' failed
make: *** [msh] Error 1
Может кто-нибудь сказать, как это исправить?
1 ответ
Итак, вот что происходит (делая безопасное предположение, что вы используете 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
mode отключает кучу функций и макросов и тому подобное, которых нет в версии стандарта C 1999 года, если они явно не запрошены, отсюда и неявное предупреждение объявления. le32toh()
это макрос, а не функция с символом в libc, следовательно, ошибка компоновщика.
Если вы читаете справочную страницу для le32toh()
вы увидите, что это нужно _DEFAULT_SOURCE
Макрос функционального теста, который должен быть определен до включения любых заголовков.
Итак, ваши варианты:
- Компилировать в
gnu99
вместо режима, так как это автоматически определяет кучу макросов тестирования возможностей. - Продолжайте использовать
c99
режим и добавить#define _DEFAULT_SOURCE
в самом начале вашего исходного файла fat32.c. - Продолжайте использовать
c99
режим и добавить-D_DEFAULT_SOURCE
на ваши аргументы компилятора.