【发布时间】:2020-11-11 05:18:12
【问题描述】:
我执行下面的代码来创建 .o 文件
clang --target=i686-pc-none-elf -march=i386 -c fcfs.c -o fcfs.o -std=gnu90 -O2 -Wall -Wextra -Wall
然后当我执行下面的代码时
i686-elf-ld -T linker.ld -o JOS.bin fcfs.o
我收到错误提示
**fcfs.c:(.text+0x13): undefined reference to `fopen'
fcfs.c:(.text+0x45): undefined reference to `fgets'
fcfs.c:(.text+0x57): undefined reference to `printf'**
我的 fcfs.c 文件
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main(){
char dataToBeRead[50];
int a = abs(-5);
FILE *fp;
fp = fopen("process.txt", "r");
// int fp=1;
printf("%d", a);
int s;
if(fp != NULL){
printf("File is not empty");
while( fgets ( dataToBeRead, 50, fp ) != NULL )
{
// Print the dataToBeRead
printf( "%s" , dataToBeRead ) ;
}
}
return 0;
}
为什么我会收到此错误。
我是否需要向与库链接相关的 clang 添加更多参数?
我可以在 clang 中使用 gcc 库吗?
还是i686-elf-ld的问题?
【问题讨论】:
-
头文件不是库。它们只提供描述函数的声明,而不是实现函数的实际对象模块。要链接完整的程序,您需要包含包含函数实现的文件。默认情况下,用于编译和构建的 Clang 和 GCC 命令在链接时包括这些。但如果您尝试做一些特殊的或跨工具的链接,您可能需要在链接命令中明确包含文件。
-
请注意,GCC 常用的库是 GNU C 库,而不是 GCC 库本身。我不知道您安装的 Clang 是否可以与您安装的 GNU C 库一起使用。
-
这解决了我的疑问,感谢您纠正我的头文件和库。
标签: c gcc include clang cross-compiling