在C语言中了解如何从另一个源文件调用函数

4

我将尝试适当地理解如何在C语言中从另一个源文件调用C函数。 我有一个简单的示例,我正在尝试使其工作。 我有两个函数function1和function2,它们包含在file.c文件中。 我试图从main.c中调用function2,但收到“对function2的未定义引用”错误。

main.c

#include <stdio.h>
#include <stdlib.h>
#include "file.h"
int main()
{
    int result = function2(3);
    printf("Result = %d  ", result);
    return 0;
}

file.c

int function1(int a)    /* Function 1  definition */
{
    int val = a*a;

    return val;
}

int function2(int val)    /* Function 2 definition */
{
    return val +5;
}

file.h

#ifndef FILE_H_INCLUDED
#define FILE_H_INCLUDED
extern int function1(int a) ;
extern int function2(int val);


#endif // FILE_H_INCLUDED

我知道function1和function2可以合并成一个函数,但我想了解为什么这个例子不起作用!-谢谢

2
你是怎么编译的? - Sourav Ghosh
1
你需要检查选项,将那些目标文件链接在一起。 - Sourav Ghosh
3
与您的问题无关,但您应该在 file.c 的开头也包含 file.h。这将使您能够发现如果 file.h 中的声明与 file.c 不同,就可以发现错误。 - Jabberwocky
1
仅仅将源文件放在同一个目录下并不会导致Codeblocks自动编译和链接它们与main.c。正如@SouravGhosh所说,您需要检查编译/链接选项。 - lurker
1
  1. 在你的情况下,声明中不需要使用 extern 关键字;
  2. 应该在程序中包含相应的头文件(例如,a.c 应该在任何其他内容之前包含 a.h) - 这并非总是必要的,但这是一个好的习惯;
  3. 我猜你需要将 file.c 添加到你的 Codeblocks 项目中 - 而不仅仅是把它留在同一个目录下。
- jweyrich
显示剩余2条评论
2个回答

2
在Codeblocks中,选择文件-新建-项目。选择控制台应用程序,下一步。选择语言C,下一步。选择项目标题路径等,下一步。编译器应该是GCC,不要更改任何设置,完成。在项目窗口中,将相关文件添加到项目中。您已经获得了一个main.c文件,因此创建一个file.c文件并将其添加到项目中。添加h文件也很方便,但不是必需的。构建和运行。输出:结果=8。将代码复制/粘贴到main.c、file.c和file.h文件中可以正常工作。

与问题无关的其他好建议:

  • 设置 -> 编译器 -> 编译器标志选项卡。勾选对应于 -Wall -Wextra 和 -pedantic-errors 的选项。如果没有 C11 选项,请添加一个。参见此处

  • 正如某人指出的那样,您应该始终从 file.c 中 #include "file.h"


1
你的源代码是正确的。你可能没有将这两个目标文件链接在一起来创建一个可执行文件。
从命令行编译这两个文件为目标文件。
cc -Wall -std=c11 -c main.c

创建 main.o。
cc -Wall -std=c11 -c file.c

创建 file.o 文件,然后将它们链接起来。
cc -o my-executable main.o file.o

然后你将会得到一个可运行的二进制文件,叫做my-executable。如果你使用的是集成开发环境(IDE),也有相应的方法来完成上述操作,但这取决于所使用的IDE。


OP已经有一个IDE,因此使用Codeblocks标签是不正确的。这并没有回答问题。 - Lundin
我没有看到任何需要 c11 的内容。 - Grady Player
1
@Lundin 当我回答时,它没有[codeblocks]标签,但总的来说仍然是正确的。 - JeremyP
1
@GradyPlayer 肌肉记忆 - JeremyP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接