簡體   English   中英

編譯 C 程序時出現大量錯誤

[英]Getting tons of errors when compiling a C program

發生這個大錯誤時,我試圖運行以下程序。 我究竟做錯了什么?

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main() {

    char *file = "zahl.txt";
    int fd;
    
    struct flock lock = { F_WRLCK, SEEK_SET, 0, 0, 0 };
    lock.l_pid = getpid();
    fd = open(file, O_RDWR | O_APPEND);
    
    if (fcntl(fd, F_SETLKW, &lock) != -1)
    //setting the lock to wait while another instance is already running
    {
        FILE *fp1;
        int i;
        char buff[255];
        fp1 = fopen(file, "a+"); //read from file
        while (fgets(buff, 255, fp1) != NULL); //moves to last line of file
        i = atoi(buff);
        i++;
        char temp[10];
        sprintf(temp, "%d\n", i); //printing the incremented value to temp
        fputs(temp, fp1);
        fclose(fp1);
    
        lock.l_type = F_UNLCK;
        fcntl(fd, F_SETLK, &lock);
        close(fd);
    }
    return 0;
}
 [rmig0489@linux Assign9]$ gcc -Wall -o -g ink ink.c

ink: In function _start': (.text+0x0): multiple definition of _start' /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/ crt1.o:(.text+0x0): 這里首先定義ink: In function _fini': (.fini+0x0): multiple definition of /usr/lib/gcc/x86_64-redhat-linux/4.4.7/ ../../../../lib64/crti.o:(.fini+0x0): 這里先定義ink:(.rodata+0x0): _IO_stdin_used' /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o:(.rodata.cst4+0x0): first defined here ink: In function __data_start': (.data+ 0x0): __data_start' /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o:(.data+0x0): first defined here ink:(.rodata+0x8): multiple definition of /usr/lib/gcc/x86_64-redhat-linux/4.4.7/crtbegin.o:(.rodata+0x0): 這里先定義ink:在函數_init': (.init+0x0): multiple definition of _init' /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crti。 o:(.init+0x0): 首先在這里定義 /tmp/ccmuhndv.o: In functio n main': ink.c:(.text+0x0): multiple definition of ink:/home/scs/licenta/an1/gr712/rmig0489/C-Programm/Assign9/ink.c:6:這里先定義/usr/lib/gcc/x86_64-redhat-linux/4.4.7/crtend.o:(.dtors+0x0): ` DTOR_END '的多重定義 ink:(.dtors+0x8): 這里先定義/usr/bin /ld:警告:無法創建 .eh_frame_hdr 部分,--eh-frame-hdr 被忽略。 /usr/bin/ld:墨水錯誤(.eh_frame); 不會創建 .eh_frame_hdr 表。 collect2: ld 返回 1 個退出狀態

問題出在命令行: gcc -Wall -o -g ink ink.c

-o參數必須后跟輸出文件的名稱,因此使用-g來執行此操作,並且gccink (由先前命令生成的可執行文件)視為二進制模塊,以與從ink.c編譯的目標模塊鏈接ink.c和 C 庫,因此所有重復的內部符號。

使用這個命令:

gcc -Wall -g -o ink ink.c

還要注意代碼中的這些問題:

  • 在最后一次調用fgets()之后依賴buff的內容是不正確的,尤其是在文件恰好為空的情況下。 相反,您應該轉換成功讀取的每一行並使用最后一次轉換。

  • 在從讀取文件切換到寫入文件之前,您必須調用fseek(fp1, 0L, SEEK_CUR)

  • char temp[10]; 不足以轉換所有可能的int值。 您應該使數組更大並使用snprintf以確保安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM