【发布时间】:2020-03-20 01:16:04
【问题描述】:
我一直在用 C 语言开始一个小项目,目的是创建一个我自己的库,以便轻松使用单链表。
我在项目中使用了三个文件:主文件(main.c)、头文件(带有头文件保护,sll.h)和它的声明+定义文件“sll.c”
但是,我在这种状态下尝试编译 C 程序时遇到了三个错误:
文件 1 main.c
#include <stdio.h>
#include <stdlib.h>
#include "sll.h"
int main(){
return 0;
}
文件 2 sll.h
#ifndef SLL_H_11_14_2019
#define SLL_H_11_14_2019
typedef struct Node {
int data;
struct Node * next;
} Node;
typedef struct List {
int size;
Node * head;
} List;
List createSLList();
void appendSLList(List list);
int searchSLList(List list, int key);
void popSLList(List list);
void removekeySLList(List list, int key);
void removeSLList(List list, int index);
void deleteList(List list);
#endif
文件 3 sll.c
#include <stdio.h>
#include <stdlib.h>
#include "sll.h"
/* Contains source code for sll.h. Should not be used standalone without sll.h to avoid duplication issues. */
/* This library provides definition for functions to create and manipulate a single linked list. */
List createSLList(){
List list;
list.size = 0;
list.head = NULL;
return list;
}
void appendSLList(List list);
int searchSLList(List list, int key);
void popSLList(List list);
void removekeySLList(List list, int key);
void removeSLList(List list, int index);
void deleteList(List list);
错误:
sll.o In function `createSLList':
7 sll.c multiple definition of `createSLList'
main.o sll.c:17: first defined here
collect2.exe [Error] ld returned 1 exit status
25 Makefile.win recipe for target 'sll.exe' failed
我真的很困惑; createSLList 只定义一次。我看了看,(显然)stdio.h 和 stdlib.h 不应该抛出任何错误,考虑到它们有自己的标头保护,那么有什么问题呢?
编辑:使用 GCC 4.9.2 64 位调试编译 使用语言标准 C99 并启用所有警告 + 使其成为致命错误。
Edit2:事后看来,我做了#include "sll.h"。编辑并发布了新代码,但错误仍然存在。也发布了makefile.win。
//makefile.win
# Project: single linked list
# Makefile created by Dev-C++ 5.11
CPP = g++.exe -D__DEBUG__
CC = gcc.exe -D__DEBUG__
WINDRES = windres.exe
OBJ = main.o sll.o
LINKOBJ = main.o sll.o
LIBS = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib" -static-libgcc -g3
INCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include"
CXXINCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++"
BIN = sll.exe
CXXFLAGS = $(CXXINCS) -std=c99 -Wall -Werror -g3
CFLAGS = $(INCS) -std=c99 -Wall -Werror -g3
RM = rm.exe -f
.PHONY: all all-before all-after clean clean-custom
all: all-before $(BIN) all-after
clean: clean-custom
${RM} $(OBJ) $(BIN)
$(BIN): $(OBJ)
$(CC) $(LINKOBJ) -o $(BIN) $(LIBS) //ERROR IS HERE
main.o: main.c
$(CC) -c main.c -o main.o $(CFLAGS)
sll.o: sll.c
$(CC) -c sll.c -o sll.o $(CFLAGS)
【问题讨论】:
-
在多个编译中包含一个定义,获取多个定义。这里有什么难以理解的部分?
-
你为什么要多次包含标题
#include <stdio.h> #include <stdlib.h> -
您能给我们看一个 Makefile 的内容吗?似乎您的 createSLList 被编译了两次(在 sll.c -> sll.o、main.c(包括通过 sll.h 的 sll.c 代码)-> main.o),因此 Makefile 可能有助于找到解决方案。
-
@roottraveller 因为我在 sll.c 中需要它们。没关系,他们有头部保护,这不应该引起问题。
-
@jthill 如果您能详细说明一下吗?