如何使用C中的头文件链接两个文件

时间:2014-11-09 13:47:48

标签: c

我正在尝试链接两个文件。意思是,有文件“file1.c”和“file2.c”。

file1.c中

#include"stdlib.h"
#include"stdio.h"
 void function1(int a)
 {
printf("hello I am file%d.c\n ", a);
  }
 void main()
 {
 function1(1);
  }

file2.c中

#include"stdlib.h"
#include"stdio.h"
#include"file.h"
void function2(int b)
{
 printf("hello I am file%d.c\n", b);
 }
int main()
{
 function2(2);
 function1(1);
 }

然后我将头文件file.h设为

#ifndef hell
#define hell
 void function1(int a);
#endif

当我将file2.c编译为“gcc file2.c file1.c -o file2时 “它给出了以下错误

/tmp/cc4tno9R.o: In function `main':
 file1.c:(.text+0x24): multiple definition of `main'
/tmp/ccL4fEki.o:file2.c:(.text+0x24): first defined here
 collect2: ld returned 1 exit status

如何在头文件中写入?头文件中有错误吗? 或者file2.c中的错误?

那么extern呢?它是否用于相同的目的?

4 个答案:

答案 0 :(得分:3)

您不需要在第一个文件中包含所有库文件。只需将其保存为带有" .h"的库文件。扩展为库文件并将其包含在第二个文件中,如下所示。

file1.h

void function1(int a) {
    printf("hello I am file%d.c\n ", a);
}

file2.c中

#include <stdlib.h>
#include <stdio.h>
#include "file.h"

void function2(int b) {
    printf("hello I am file%d.c\n", b);
}

int main() {
    function2(2);
    function1(1);

return 0;

}

答案 1 :(得分:2)

说目录结构如下:

                  Project
                     |
       ------------------------------
      |              |              |
    csource        output         header
      |              |              |
    *.c files    executable      .h files
                   files

现在,将这两个.c files放在source文件夹中。

<强> function.c

int sum(int a, int b)
{
    return (a + b);
}

<强>的main.c

#include <stdio.h>
#include <stdlib.h>
#include <mymath.h>

int main(void)
{
    int result = sum(11, 19);
    printf("Result: %d\n", result);

    return EXIT_SUCCESS;
}

将此标题文件放在header文件夹中。

<强> mymath.h

#ifndef _MyMath_H__
#define _MyMath_H__
int sum(int, int);
#endif

<强>汇编

首先,我们将汇编function.c个文件并创建一个object file扩展名.o,如下所示:

C:\Mine\C\test\project>gcc -o output\function.o -c source\function.c

On Cygwin:

Gagandeep Bali@LAPTOP ~/c/Mine/C/test/project
$ gcc -o output/function.o -c source/function.c

由于function.c不包含main方法,因此我们只使用-c选项,仅创建object file

在这里,使用-I选项,基本上告诉编译器,在哪里寻找包含文件。因为,我们正在定义我们的header文件夹,因此,您可以使用#include <mymath.h>代替#include "mymath.h". Now we will compile the main.c`文件:

C:\Mine\C\test\project>gcc -o output\main -I header\ -Wall source\main.c output\function.o

On Cygwin:

Gagandeep Bali@LAPTOP ~/c/Mine/C/test/project
$ gcc -o output/main -I header/ -Wall source/main.c output/function.o

现在可以运行它,例如:

C:\Mine\C\test\project>.\output\main
Result: 30

On Cygwin:

Gagandeep Bali@LAPTOP ~/c/Mine/C/test/project
$ ./output/main
Result: 30

您还可以创建可以使用的自定义函数的静态和动态库。我只知道,如何创建一个静态库。

如果您想创建自己的静态库,只需先将所有object files放入库中即可。为此目的创建另一个文件夹,例如library。现在在库中添加所有.o个文件,如下所示:

Gagandeep Bali@LAPTOP ~/c/Mine/C/test/project
$ ar cr library/mymathlibrary.a output/function.o

现在只需编译程序,如:

Gagandeep Bali@LAPTOP ~/c/Mine/C/test/project
$ gcc -Wall source/main.c library/mymathlibrary.a -o output/main -I header

按照前面的说明运行。

答案 2 :(得分:1)

所以看起来应该是这样的:

file1.c中:

#include <stdlib.h>
#include <stdio.h>

void function1(int a) {
    printf("hello I am file%d.c\n ", a);
 }

file2.c中:

#include <stdlib.h>
#include <stdio.h>
#include "file.h"

void function2(int b) {
    printf("hello I am file%d.c\n", b);
}

int main() {
    function2(2);
    function1(1);

    return 0;

}

答案 3 :(得分:1)

运行程序main正在调用。如果你有2个主要定义,应该调用哪一个?

应该有一个文件包含main,另一个文件包含您要在第一个文件中使用的功能。