c - 使用 GCC 交叉编译器时对 printf 的 undefined reference

标签 c gcc mips cross-compiling undefined-reference

我正在尝试使用针对 mips 的交叉编译器 (GCC 4.9.2) 编译以下简单的“Hello World”程序:

#include <stdio.h>

int main()
{
  int x = 5;
  printf("x = %d\n", x);
}

x 变量用于阻止 GCC 将 printf 更改为 puts,对于一个简单的以换行符结尾的字符串,它似乎会自动执行此操作.

我在 ${HOME}/xc 下构建了一个交叉编译器,并使用以下命令执行它:

${HOME}/xc/bin/mips-gcc -v hello.c

但是,我收到以下错误:

/tmp/ccW5mHJu.o: In function `main':
(.text+0x24): undefined reference to `printf'
collect2: error: ld returned 1 exit status

我假设这是链接器的问题,因为如果例如在搜索路径上找不到 stdio.h,我预计该过程会更早失败。我可以编译一个更简单的程序,它只返回零,所以并不是整个工具链都坏了,可能只是标准库链接(我使用的是 newlib 2.2.0-1)。

无论我在 Linux (Ubuntu 14.10) 还是 Cygwin (Windows 8) 下运行交叉编译器,我都会得到同样的错误。

GCC 的完整输出是:

Using built-in specs.
COLLECT_GCC=/home/paul/xc/bin/mips-gcc
COLLECT_LTO_WRAPPER=/home/paul/xc/libexec/gcc/mips/4.9.2/lto-wrapper
Target: mips
Configured with: /home/paul/xc/mips/tmp/gcc-4.9.2/configure --prefix=/home/paul/xc --target=mips --enable-languages=c --with-newlib --without-isl --without-cloogs --disable-threads --disable-libssp --disable-libgomp --disable-libmudflap
Thread model: single
gcc version 4.9.2 (GCC) 
COLLECT_GCC_OPTIONS='-v'
 /home/paul/xc/libexec/gcc/mips/4.9.2/cc1 -quiet -v hello.c -quiet -dumpbase hello.c -auxbase hello -version -o /tmp/ccCpAajQ.s
GNU C (GCC) version 4.9.2 (mips)
    compiled by GNU C version 4.9.1, GMP version 6.0.0, MPFR version 3.1.2, MPC version 1.0.3
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/sys-include"
#include "..." search starts here:
#include <...> search starts here:
 /home/paul/xc/lib/gcc/mips/4.9.2/include
 /home/paul/xc/lib/gcc/mips/4.9.2/include-fixed
 /home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/include
End of search list.
GNU C (GCC) version 4.9.2 (mips)
    compiled by GNU C version 4.9.1, GMP version 6.0.0, MPFR version 3.1.2, MPC version 1.0.3
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: cffaaedf0b24662e67a5d97387fc5b17
COLLECT_GCC_OPTIONS='-v'
 /home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/bin/as -EB -O1 -no-mdebug -mabi=32 -o /tmp/ccW5mHJu.o /tmp/ccCpAajQ.s
COMPILER_PATH=/home/paul/xc/libexec/gcc/mips/4.9.2/:/home/paul/xc/libexec/gcc/mips/4.9.2/:/home/paul/xc/libexec/gcc/mips/:/home/paul/xc/lib/gcc/mips/4.9.2/:/home/paul/xc/lib/gcc/mips/:/home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/bin/
LIBRARY_PATH=/home/paul/xc/lib/gcc/mips/4.9.2/:/home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/lib/
COLLECT_GCC_OPTIONS='-v'
 /home/paul/xc/libexec/gcc/mips/4.9.2/collect2 -plugin /home/paul/xc/libexec/gcc/mips/4.9.2/liblto_plugin.so -plugin-opt=/home/paul/xc/libexec/gcc/mips/4.9.2/lto-wrapper -plugin-opt=-fresolution=/tmp/cc8TAJb9.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc -EB /home/paul/xc/lib/gcc/mips/4.9.2/crti.o /home/paul/xc/lib/gcc/mips/4.9.2/crtbegin.o -L/home/paul/xc/lib/gcc/mips/4.9.2 -L/home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/lib /tmp/ccW5mHJu.o -lgcc -lgcc /home/paul/xc/lib/gcc/mips/4.9.2/crtend.o /home/paul/xc/lib/gcc/mips/4.9.2/crtn.o
/home/paul/xc/lib/gcc/mips/4.9.2/../../../../mips/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000000400050
/tmp/ccW5mHJu.o: In function `main':
(.text+0x24): undefined reference to `printf'
collect2: error: ld returned 1 exit status

我正在使用的构建脚本在这里(我根据六个教程编写它,它们都建议略有不同的东西):

https://github.com/UoMCS/mips-cross-compile

基本上它执行以下步骤:

  1. 构建 binutils。
  2. 构建 GCC(第 1 阶段)。
  3. 构建新库。
  4. 构建 GCC(第 2 阶段)。

我知道还有其他工具,例如 crosstool-ng 和 builtroot,但是我正在构建这个工具链的人想要在启动构建过程之前编辑 binutils 的部分,并且工具链也必须工作在 Cygwin 下(由于各种原因,crosstool-ng 不会,包括区分大小写的文件路径)。

我认为这可能是显而易见的事情,但我已经弄乱了一个星期,看不出它会是什么。任何帮助将不胜感激!

最佳答案

有必要构建库以配合您的交叉编译器。特别是,您需要有 glibc 的交叉编译版本或标准库的其他一些实现,才能获得 printf() 的版本。

看看this link获取您需要考虑的事物类型的示例,以获得您需要的所有事物 - 交叉编译器、 header 和库。

关于c - 使用 GCC 交叉编译器时对 printf 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30012353/

相关文章:

c - 杀掉用popen2创建的进程

c - 使用系统调用打印结果

c++ - 不完整类型/前向声明的无效使用

c - -lm 不工作,除非它在命令的末尾

objective-c - 有类似 "jump to"或 "go to"的东西吗?

iphone - 从 iphone 中的 .wav 文件读取时数据为空?

c - Clang 中 __int128_t 的错误?

c - MIPS - 帮助从 C 转换代码

assembly - 如何转换 Mips 伪指令?

MIPS 结构性危害