首页 > 解决方案 > 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)

标签: clistexceptionheader

解决方案


问题是 Dev-C++ 最初将我的程序编译为 C++ 程序,即使我已经“选择”C 作为默认语言。结果,这产生了破坏性后果。

对于任何面临类似问题的人,对我有用的是删除编译器创建的所有文件并重新启动 IDE。请注意,您应该在“项目设置”下手动设置要使用的编译器。


推荐阅读