链接中的多个定义

时间:2018-11-01 14:17:03

标签: c linker

我是Linking的初学者,可以说我有两个.c文件

file1.c是

#include <stdio.h>
#include "file2.c"


int main(int argc, char *argv[]) 
{
    int a = function2();
    printf("%d",a);
    return 0;
}

和file2.c是

int function2() 
{ 
    return 2018;
}

当我编译时,有一个链接器错误,它是function2的多个定义,但是我在file2.c中只定义了一次函数?

3 个答案:

答案 0 :(得分:2)

您应该使用以下文件创建头文件“ file2.h”:

int function2(void);

和具有功能:“ file2.h”的文件“ file2.c”,具有:

#include "file2.h"

int function2(void) 
{ 
    return 2018;
    ...
} 

然后在您的主目录中,必须在标题中包含以下内容:

#include "file2.h"

请注意所有这些文件都应位于同一文件夹中,以避免出现任何链接问题

答案 1 :(得分:2)

尝试这样的事情:

#include <stdio.h>
#include "file2.h"

int main(int argc, char *argv[]) 
{
    int a = function2();
    printf("%d",a);
    return 0;
}

file2.h:

extern int function2(void);

和file2.c是

#include "file2.h"

int function2(void) 
{ 
    return 2018;
}

然后将其链接在一起。

答案 2 :(得分:1)

语句#include "file2.c"有效地将file2.c的内容合并到file1.c中。然后file1.c被编译为包含以下内容:

int function2() 
{ 
    return 2018;
}

这些行定义 function2;他们告诉编译器“这里是function2,为其创建代码。”由于这些行有效地出现在file1.cfile2.c中,因此您的程序具有function2的两个副本。

相反,您应该创建包含以下内容的file2.h

int function2();

该行告诉编译器“存在一个名为function2的函数,但其​​定义在其他地方。”

然后,在file1.c中使用#include "file2.h"代替#include "file2.c"。这将告诉编译器,在编译file1.c时,需要知道什么才能编译对function2的调用。编译器将具有所需的声明,但将不具有定义,而在file1.c中则不需要。

还要在file2.c中插入#include "file2.h"。然后file2.c将包含function2的声明(来自file2.h)和function2的定义(来自file2.c的实际行)。这样做的目的是使编译器在编译file2.c时可以同时看到声明和定义,从而可以在出现印刷错误并使其不兼容时向您发出警告。

此外,在C语言中,您应该使用int function2(void)而不是int function2()。由于历史原因,后者保留未指定的参数。使用(void)会告诉编译器没有参数。