неопределенная ссылка на ошибку `le16toh 'в Makefile - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь скомпилировать программу на 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 Ответ

0 голосов
/ 09 ноября 2018

Итак, вот что происходит (делая безопасное предположение, что вы используете 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 , который должен быть определен до включения любых заголовков .

Итак, ваши варианты:

  1. Вместо этого скомпилируйте в режиме gnu99, поскольку это автоматически определяет набор макросов тестирования возможностей.
  2. Продолжайте использовать режим c99 и добавьте #define _DEFAULT_SOURCE в самом начале вашего исходного файла fat32.c.
  3. Продолжайте использовать режим c99 и добавьте -D_DEFAULT_SOURCE к аргументам компилятора.
...