Makefile 中对 ‘le16toh’ 错误的未定义引用

undefined reference to `le16toh' error in Makefile

我正在尝试使用以下 Makefile 编译 C 程序:

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

谁能告诉我如何解决这个问题?

所以,这是正在发生的事情(安全地假设您在 VM 中使用 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 模式下编译会禁用一堆函数和宏,这些函数和宏不在 1999 版的 C 标准中,除非明确要求,因此会出现隐式声明警告。 le32toh() 是一个宏,而不是 libc 中带有符号的函数,因此出现链接器错误。

如果您阅读 man page for le32toh(), you'll see that it needs the _DEFAULT_SOURCE feature test macro,必须在包含任何 headers 之前定义它。

因此,您的选择是:

  1. 改为在 gnu99 模式下编译,因为这会自动定义一堆功能测试宏。
  2. 继续使用 c99 模式并在 fat32.c 源文件的开头添加 #define _DEFAULT_SOURCE
  3. 继续使用 c99 模式并将 -D_DEFAULT_SOURCE 添加到您的编译器参数。