我是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中只定义了一次函数?
答案 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.c
和file2.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)
会告诉编译器没有参数。