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 之前定义它。
因此,您的选择是:
- 改为在
gnu99
模式下编译,因为这会自动定义一堆功能测试宏。
- 继续使用
c99
模式并在 fat32.c 源文件的开头添加 #define _DEFAULT_SOURCE
。
- 继续使用
c99
模式并将 -D_DEFAULT_SOURCE
添加到您的编译器参数。
我正在尝试使用以下 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 之前定义它。
因此,您的选择是:
- 改为在
gnu99
模式下编译,因为这会自动定义一堆功能测试宏。 - 继续使用
c99
模式并在 fat32.c 源文件的开头添加#define _DEFAULT_SOURCE
。 - 继续使用
c99
模式并将-D_DEFAULT_SOURCE
添加到您的编译器参数。