【问题标题】:C Function Multiple Definition Error but declared once?C函数多重定义错误但声明一次?
【发布时间】: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 &lt;stdio.h&gt; #include &lt;stdlib.h&gt;
  • 您能给我们看一个 Makefile 的内容吗?似乎您的 createSLList 被编译了两次(在 sll.c -> sll.o、main.c(包括通过 sll.h 的 sll.c 代码)-> main.o),因此 Makefile 可能有助于找到解决方案。
  • @roottraveller 因为我在 sll.c 中需要它们。没关系,他们有头部保护,这不应该引起问题。
  • @jthill 如果您能详细说明一下吗?

标签: c list exception header


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多