【发布时间】:2020-10-04 08:06:46
【问题描述】:
我尝试包含几乎所有标题组合。尝试使用以下方法编译目标文件:
gcc database.c -c
gcc database.o user_interface.c -o database
结果是:
/tmp/ccWfp2tS.o: In function `addRecord':
user_interface.c:(.text+0x4b9): multiple definition of `addRecord'
database.o:database.c:(.text+0x0): first defined here
/tmp/ccWfp2tS.o: In function `printAllRecords':
user_interface.c:(.text+0x54a): multiple definition of `printAllRecords'
database.o:database.c:(.text+0x1a): first defined here
/tmp/ccWfp2tS.o: In function `findRecord':
user_interface.c:(.text+0x590): multiple definition of `findRecord'
database.o:database.c:(.text+0x24): first defined here
/tmp/ccWfp2tS.o: In function `deleteRecord':
user_interface.c:(.text+0x5ed): multiple definition of `deleteRecord'
database.o:database.c:(.text+0x36): first defined here
collect2: error: ld returned 1 exit status
user_interface.c
#include "record.h"
int debugmode;
int main(int argc, char *argv[])
{
// my code here
}
// other functions: AddRecord, printallRecords,...
数据库.h
#include "record.h"
int addRecord (struct record **, int, char [ ],char [ ]);
void printAllRecords(struct record *);
int findRecord (struct record *, int);
int deleteRecord(struct record **, int);
数据库.c
#include "database.h"
extern int debugmode;
int addRecord(struct record ** start, int account, char name[], char address[])
{
/*my code here*/
return 0;
}
/*other functions...*/
记录.h
struct record
{
int accountno;
char name[25];
char address[80];
struct record* next;
};
【问题讨论】:
-
根据 user_interface.c 中的注释,听起来您在两个文件中定义了相同的功能。这将有助于查看所有文件,而不仅仅是您认为相关的 sn-ps。
-
// other functions: AddRecord, printallRecords,...问问自己为什么user_interface.c和database.c都有这些。您确实在两个不同的源文件中提供了 same 函数的两个实现,并且链接器在尝试修复标识符时准确地告诉您。 -
@JoanaF。确切地。这完全是问题所在。从代码的外观来看,user_interface.c 应该包含用于类型声明的 record.h 和 database.h,并且这些 db 函数的实现应该在 database.c only 中。顺便说一句,您可能还需要在标题中包含保护围栏。
-
你的构建命令也被打了。您应该使用
gcc -c -o database.o database.c作为数据库对象代码,gcc-c -o user_inteface.o user_interface.c作为 ui 对象代码,最后使用gcc -o database user_interface.o database.o作为最终链接。那,假设你做的一切都正确。 -
如果
user_interface.c正在调用database.h中声明的函数,那么它需要#include "database.h"