Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 对“le16toh'”的未定义引用;Makefile中的错误_C_Makefile_Fat32 - Fatal编程技术网

C 对“le16toh'”的未定义引用;Makefile中的错误

C 对“le16toh'”的未定义引用;Makefile中的错误,c,makefile,fat32,C,Makefile,Fat32,我正试图用以下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

我正试图用以下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新测试c-L-lFAT32
./libFAT32.so:对“le32toh”的未定义引用
./libFAT32.so:对“le16toh”的未定义引用
collect2:错误:ld返回了1个退出状态
Makefile:19:目标“msh”的配方失败
make:**[msh]错误1

有人能告诉我们如何解决这个问题吗?

那么,下面是发生了什么事情(安全地假设您在虚拟机中使用的是linux发行版)

使用此测试程序:

#包括
#包括
内部主(空){
printf(“%d\n”,le32toh(1234));
返回0;
}
编译和运行it工作:

$ 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中带有符号的函数,因此出现链接器错误

如果您阅读了for
le32toh()
,您将看到它需要
\u DEFAULT\u SOURCE
,必须在包含任何标题之前定义该源

因此,您的选择是:

  • 而是在
    gnu99
    模式下编译,因为这会自动定义一组特性测试宏
  • 继续使用
    c99
    模式,并在fat32.c源文件的最开始处添加一个
    #define_DEFAULT_SOURCE
  • 继续使用
    c99
    模式,并将
    -D_DEFAULT_SOURCE
    添加到编译器参数中

  • c/c++代码是否包含?通常,它提供的那些函数会变成内联代码(或完全消失),因此通常没有任何外部函数可供参考。我确实包含了endian.h什么是gcc版本?
    -I.
    您是
    \include
    还是
    \include“endian.h”
    ?目录中的endian.h是否覆盖了默认的/usr/include/endian.h include?可能是宏或至少是内联函数,不应与链接。如果没有,可能只编写您自己的函数,可能
    fat32.c
    希望您编写它。gcc 7.3.0版