c - C函数多重定义错误但声明一次?
问题描述
我一直在用 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)
解决方案
问题是 Dev-C++ 最初将我的程序编译为 C++ 程序,即使我已经“选择”C 作为默认语言。结果,这产生了破坏性后果。
对于任何面临类似问题的人,对我有用的是删除编译器创建的所有文件并重新启动 IDE。请注意,您应该在“项目设置”下手动设置要使用的编译器。
推荐阅读
- android - Delphi - 小米 Pocophone F1 上的 Android 开发
- python-3.x - 如何使用 pygame 常量修复 Python pep 8 建议
- arrays - 从每一行的特定列中获取值
- angular - 无法在 github 页面上部署 Angular7 应用程序
- c++ - 如何调用存储在地图中的函子?
- qt - Qt5 OpenCV3.4.5 LNK1105 无法打开 opencv_world345d.obj
- java - 如何在 Java 中使用 ExecutorService(一个池 Executors.newFixedThreadPool() 或多个 Executors.newSingleThreadExecutor())
- jquery - 无法让 getJSON 显示由 Flask 应用程序生成的 JSON
- python - 在 Python 中更改列表的值
- hybris - 通过代码在我的动态枚举中添加新值时出错