在 Ubuntu 11.10 中使用 gcc 链接错误 [英] Linking error using gcc in Ubuntu 11.10

查看:16
本文介绍了在 Ubuntu 11.10 中使用 gcc 链接错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试用 C 编译并运行一个简单的Hello World"程序,但遇到一个奇怪的错误一些C标准库函数的多重定义

I'm trying to compile and run a simple "Hello World" program in C, and I get a strange error of multiple definition of some C stdlib functions

.c 文件是:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {

  printf("hello world
");
  return 0;
}

我用来编译和创建可执行文件的命令是:

the commands I use to compile and create an executable are:

gcc -Werror -Wall src/main.c -o bin/m.o
gcc -Werror -Wall bin/m.o -o bin/m

编译部分运行良好,但在第二个命令中,我调用了 GCC 链接器创建可执行文件时出现以下错误:

The compilation part goes fine, but in the second command, where I invoke the GCC Linker to create an executable I get the following errors:

bin/m.o: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/crti.o:(.fini+0x0): first defined here
bin/m.o: In function `__data_start':
(.data+0x0): multiple definition of `__data_start'
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 10
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 10
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 20 has invalid symbol index 19
/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/crt1.o:(.data+0x0): first defined here
bin/m.o: In function `__data_start':
(.data+0x8): multiple definition of `__dso_handle'
/usr/lib/gcc/x86_64-linux-gnu/4.6.1/crtbegin.o:(.data+0x0): first defined here
bin/m.o:(.rodata+0x0): multiple definition of `_IO_stdin_used'
/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/crt1.o:             (.rodata.cst4+0x0): first defined here
bin/m.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/crt1.o:/build/buildd    /eglibc-2.13/csu/../sysdeps/x86_64/elf/start.S:109: first defined here
bin/m.o: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../x86_64-linux-gnu/crti.o:(.init+0x0): first     defined here
/usr/lib/gcc/x86_64-linux-gnu/4.6.1/crtend.o:(.dtors+0x0): multiple definition of     `__DTOR_END__'
bin/m.o:(.dtors+0x8): first defined here
/usr/bin/ld: error in bin/m.o(.eh_frame); no .eh_frame_hdr table will be created.
collect2: ld returned 1 exit status

顺便说一句,当我运行带有 bash 执行前缀的 m.o 文件时,它工作得很好

by the way, when I run the m.o file with the bash executing prefix, it works just fine

从来没有用 C 或任何东西编程过,我正在尝试开始,但这阻碍了我

never programed in C or anything, I'm trying to start, but this holds me back

推荐答案

你需要一个 -c 在编译步骤,否则你的 mo 对象将是一个完全链接的可执行文件.示例:

You need a -c in the compile step, or else your m.o object will be a fully linked executable. Example:

gcc -Werror -Wall -c src/main.c -o bin/m.o
gcc -Werror -Wall bin/m.o -o bin/m

如果您的程序不只是由单个翻译单元组成,那么差异将立即显而易见.如果你有 file1.cfile2.c,例如:

The difference would be immediately obvious if your program was composed of more than just the single translation unit. If you had file1.c and file2.c, for example:

gcc -c file1.c -o file1.o
gcc -c file2.c -o file2.o
gcc file1.o file2.o -o app

是正确的,而如果你有:

Is correct, whereas if you had:

gcc file1.c -o file1.o
gcc file2.c -o file2.o
gcc file1.o file2.o -o app

在您到达最后的链接阶段之前,第一行和第二行都会失败,因为它们会丢失符号.

Both the first and second lines would fail before you even got to the final link stage, since they would be missing symbols.

这篇关于在 Ubuntu 11.10 中使用 gcc 链接错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆