[英]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 nmain': 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
來執行此操作,並且gcc
將ink
(由先前命令生成的可執行文件)視為二進制模塊,以與從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.