gpt4 book ai didi

c - 合并其他 .c 文件时 Makefile 返回错误

转载 作者:行者123 更新时间:2023-11-30 16:09:53 24 4
gpt4 key购买 nike

我一直在做一项作业,其中给我们一个 .ssv 文件,其中第一列包含银行帐户,第二列包含交易(20 表示增加 20 美元,-20 表示减去 20 美元),并要求我们使用多个 c 文件创建帐户的链接列表。

存在三个问题:main.c(打开 ssv 并逐行运行)、ssv.c(包含从 fgets() 字符串解析数据的函数)和 linked.c(创建链接的通过匹配帐号和添加交易来列出并更新帐户余额)。它们需要保持独立,不能做成.h文件。

我已经组装了一个 makefile 将所有这些文件放入一个可执行文件中,但是当我运行 make 时,它​​返回并出错。我做了一些调试,发现它似乎编译了ssv.c和main.c的目标文件,但没有编译linked.c,导致我在main.c中使用linked.c函数时出现一些问题。我在下面包含了每个文件的代码,以及当我尝试“make”时出现的错误消息。任何发现问题的帮助将不胜感激。

错误输出:

ctonne2, ~/Projects/COMP206/Assignments/ass6: make
gcc -c linked.c
gcc -c ssv.c
gcc -c main.c
main.c: In function ‘main’:
main.c:21:3: warning: implicit declaration of function ‘parse’; did you mean ‘strsep’? [-Wimplicit-function-declaration]
parse(line,&acct, &amnt);
^~~~~
strsep
main.c:22:3: warning: implicit declaration of function ‘findUpdate’; did you mean ‘initstate’? [-Wimplicit-function-declaration]
findUpdate(acct, amnt);
^~~~~~~~~~
initstate
main.c:24:2: warning: implicit declaration of function ‘prettyPrint’ [-Wimplicit-function-declaration]
prettyPrint();
^~~~~~~~~~~
gcc -o linked.o ssv.o main.o
main.o: In function `main':
main.c:(.text+0x92): undefined reference to `findUpdate'
main.c:(.text+0xb6): undefined reference to `prettyPrint'
collect2: error: ld returned 1 exit status
makefile:2: recipe for target 'bank' failed
make: *** [bank] Error 1
ctonne2, ~/Projects/COMP206/Assignments/ass6:

生成文件:

bank: linked.o ssv.o main.o
gcc -o linked.o ssv.o main.o

linked.o: linked.c
gcc -c linked.c

ssv.o: ssv.c
gcc -c ssv.c

main.o: main.c
gcc -c main.c

main.c:


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

void main() {
FILE* ssv = fopen("students.ssv", "rt");
if (ssv == NULL) {
printf("\n File opening failed");
exit(1);
}

int acct = 0;
float amnt = 0;

char line [100], bankAcc[10], balChange[10];
while (fgets(line, sizeof(line), ssv)) {
parse(line,&acct, &amnt);
findUpdate(acct, amnt);
}
prettyPrint();
}

链接.c:

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

struct ACCOUNT {
int accountNumber;
float balance;
struct ACCOUNT* next;
};

struct ACCOUNT* head = NULL;

void findUpdate(int account, float amount) {

head = (struct ACCOUNT*)malloc(sizeof(struct ACCOUNT));

if (head == NULL) exit (1);

struct ACCOUNT* current = head;

int changed = 0;

while(current->next != NULL) {
if (current->accountNumber == account) {
current->balance = current->balance + amount;
changed++;
}
current = current->next;
}

if ((changed==0)&&(current->next==NULL)) {
struct ACCOUNT* newAccount=(struct ACCOUNT*)malloc(sizeof(struct ACCOUNT));
if (newAccount == NULL) exit(1);
current->next=newAccount;
newAccount->accountNumber = account;
newAccount->balance = amount;
newAccount->next = NULL;

}
}

void prettyPrint() {
struct ACCOUNT *current = head;
while (current!=NULL) {
printf("ACCOUNT ID: %4d BALANCE: $ %7.2f \n",current->accountNumber, current->balance);
current = current->next;
}
}

ssv.c

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

void parse(char record[], int *acct, float *amnt) {
char *end;
char acctarr[10], amntarr[10];
sscanf (record, "%d %f", acct, amnt);
return;
}

.ssv 文件示例

10 100.0 
20 -50.5
10 -20.0

最佳答案

您在生成可执行文件的规则中遗漏了输出文件。

bank: linked.o ssv.o main.o
gcc -o bank linked.o ssv.o main.o

您的命令表示仅链接 ssv.omain.o,并将结果放入 linked.o 中。

关于c - 合并其他 .c 文件时 Makefile 返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59003264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com