【问题标题】:How to link two files using header file in C如何使用C中的头文件链接两个文件
【发布时间】:2014-11-09 13:47:48
【问题描述】:

我正在尝试链接两个文件。意思是,有文件“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出错?

那么外部呢?它用于相同的目的吗?

【问题讨论】:

  • 你只能有1个主!否则程序不知道从哪里开始?!?
  • 开始,将#include"stdlib.h"等替换为#include <stdlib.h>。谷歌他们的使用。或者更好的是,读一本书。
  • 正如很多人所说,在编译成汇编程序时,标签main 用于使可执行文件启动。在已编译的可执行文件中不能有多个 main。如果你想要两个可执行文件(每个主文件一个),你可以使用我为此目的制作的 makefile。它存在其他类似的项目,但是对于这个,我可以向您展示如何配置它,请问我。 github.com/carrieje/maky

标签: c


【解决方案1】:

您不需要在第一个文件中包含所有库文件。只需将其保存为库文件,扩展名为“.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;

}

【讨论】:

    【解决方案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);
    }
    

    ma​​in.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
    

    在 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选项的使用,基本上是告诉编译器,去哪里寻找include文件。因为,我们正在定义我们的header 文件夹,因此,您可以使用#include &lt;mymath.h&gt; 而不是#include "mymath.h". Now we will compile themain.c` 文件:

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

    在 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
    

    在 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
    

    然后按照前面的描述运行。

    【讨论】:

    • 谢谢,那么“extern”呢? extern 是否也用于相同目的?
    • @user3717474:实际上,默认情况下,C language 中的每个函数都是 extern,恕我直言,因为我们可以使用任何文件中的任何函数。您可以将函数声明写为extern int sum(int, int);,以强调函数定义驻留在其他文件中这一事实,而不是在它被调用/使用的位置。其余的,你最欢迎并保持微笑:-)
    【解决方案3】:

    所以一切都应该是这样的:

    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;
    
    }
    

    【讨论】:

      【解决方案4】:

      当您运行程序时,main 正在被调用。如果你有两个 main 的定义,应该调用哪一个?

      应该有一个包含main 的文件和另一个包含您要在第一个文件中使用的函数的文件。

      【讨论】:

        猜你喜欢
        • 2011-04-17
        • 1970-01-01
        • 2017-01-04
        • 2020-10-03
        • 2021-09-13
        • 2016-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多