2014-09-11 121 views
0

它編譯,但不會從.o文件鏈接到可執行文件。從現在開始,當它運行良好時(基本上,str_to_int中的所有內容),我已經取消了所有改變。C程序鏈接錯誤:是什麼導致這些?

我的代碼:

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

int str_to_int(char string[]) { 
    // takes null-terminate ascii string, returns int value 
    // value of digit at i = (value*10)+(str[i]-'0'). 
    int num=0; 
    int sign=0; 

    return num; 
} 

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

    if (argc==1) { 
     printf("usage: review_grades score1 [score2 ...]\n"); 
     printf("note: score values are non-negative.\n"); 
    } 
    else { 
     printf("population: %u \n", argc-1); // population 
     printf("%u \n", str_to_int(argv[1])); 
    } 

    return EXIT_SUCCESS ; 
} 

而且它產生的錯誤:

[email protected]:~/path/folder$ gcc -c -std=c99 review_grades.c 
[email protected]:~/path/folder$ gcc -o -std=c99 rev review_grades.o 
rev: In function `_fini': 
(.fini+0x0): multiple definition of `_fini' 
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crti.o:(.fini+0x0): firs                     t defined here 
rev: In function `__data_start': 
(.data+0x0): multiple definition of `__data_start' 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 2 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 3 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 4 has invalid symbol index 11 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 5 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 6 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 7 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 8 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 9 has invalid symbol index 2 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 10 has invalid symbol index 12 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 11 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 12 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 13 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 14 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 15 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 16 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 17 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 18 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 19 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 20 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 21 has invalid symbol index 13 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocati                    on 22 has invalid symbol index 21 
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o:(.data+0x0): firs                    t defined here 
rev: In function `__data_start': 
(.data+0x4): multiple definition of `__dso_handle' 
/usr/lib/gcc/i686-linux-gnu/4.6/crtbegin.o:(.data+0x0): first defined here 
rev:(.rodata+0x4): multiple definition of `_IO_stdin_used' 
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o:(.rodata.cst4+0x0): first defined here 
rev: In function `_start': 
(.text+0x0): multiple definition of `_start' 
/usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2 
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o:/build/buildd/eglibc-2.15/csu/../sysdeps/i386/elf/start.S:119: first defined here 
rev:(.rodata+0x0): multiple definition of `_fp_hw' 
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o:(.rodata+0x0): first defined here 
rev: In function `_init': 
(.init+0x0): multiple definition of `_init' 
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crti.o:(.init+0x0): first defined here 
review_grades.o: In function `str_to_int': 
review_grades.c:(.text+0x0): multiple definition of `str_to_int' 
rev:(.text+0xb4): first defined here 
review_grades.o: In function `main': 
review_grades.c:(.text+0x19): multiple definition of `main' 
rev:(.text+0x11b): first defined here 
/usr/lib/gcc/i686-linux-gnu/4.6/crtend.o:(.dtors+0x0): multiple definition of `__DTOR_END__' 
rev:(.dtors+0x4): first defined here 
/usr/bin/ld: error in rev(.eh_frame); no .eh_frame_hdr table will be created. 
collect2: ld returned 1 exit status 

我在做什麼錯?

+3

'gcc -o -std = c99 rev'真的做你期望的嗎?我讀到將'-std = c99'作爲*值*傳遞給參數'-o'。很奇怪。我期望'-std = c99 -o rev'。 – unwind 2014-09-11 09:52:06

+0

是的,顯然這是我的鏈接錯誤。謝謝!如果可以的話,我會讓你滿意的。 – 2014-09-11 09:54:22

回答

5

你不小心插入的-o之間的-std=c99選項和它的說法,rev

換句話說,而不是這樣的:

-o -std=c99 rev 

你應該有這樣的:

-std=c99 -o rev 

或本:

-o rev -std=c99 

然而,不需要爲-std=選項只有有的命令文件作爲輸入,所以你不妨完全刪除它。

錯誤消息是因爲該命令已將rev解釋爲輸入文件,但由於它已被鏈接(可能是以前的編譯嘗試),因此無法在不存在的情況下重新鏈接可執行文件是重複的符號(不管怎樣)。

相關問題