使用 clang 的交叉编译中对 `printf' 的未定义引用

undefined reference to `printf' in cross-compilation using clang

我执行下面的代码来创建 .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 支持头文件,例如 stdio.h 、stdlib.h 和其他头文件。

如果您遇到类似

的问题
fcfs.c:(.text+0x13): undefined reference to `fopen'
fcfs.c:(.text+0x57): undefined reference to `printf'

在 clang 中,您可以通过将 --sysroot 添加到您的 clang 选项来解决它。 就我而言

   clang --target=i686-pc-none-elf -march=i386 --sysroot=/usr -c fcfs.c -o fcfs.o -std=gnu90 -O2 -Wall -Wextra -Wall

在这种情况下,-sysroot 将开始从 /usr 文件夹中查找头文件。在 /usr 中,它会找到像 /bin ,/include ,etc 这样的文件夹。当它转到 /include 文件夹时,它将找到所有头文件,这将解决问题。

有关更多信息,请参阅 https://clang.llvm.org/docs/CrossCompilation.html