【问题标题】:undefined reference to `printf' in cross-compilation using clang使用 clang 进行交叉编译时未定义对“printf”的引用
【发布时间】: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


【解决方案1】:

Clang 确实支持 stdio.h 、 stdlib.h 等头文件和其他头文件。

如果您遇到类似的问题

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

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

   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

【讨论】:

    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 2016-05-11
    • 2011-10-24
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    相关资源
    最近更新 更多