在C程序中包含源文件

时间:2009-10-26 23:15:28

标签: c

如何在这个小程序中包含foo.c的foo()函数(对不起我的noob问题):

在我的foo.h文件中:

/* foo.h */
#include <stdio.h>
#include <stdlib.h>

int foo(double largeur);

在foo.c中:

/* foo.c */
#include <stdio.h>
#include <stdlib.h>
#include "foo.h"

int foo(double largeur)
{
  printf("foo");
  return 0;
}

在main.c:

/* main.c */
#include <stdio.h>
#include <stdlib.h>
#include "foo.h"

int main(int argc, char *argv[])
{
  printf("Avant...");
  foo(2);
  printf("Apres...");
  return 0;
}

编译后:

  

$ gcc -Wall -o main main.c

我收到此错误:

  

未定义的符号:“_ foo”,   引自:         _main in ccerSyBF.o ld:symbols未找到collect2:ld   返回1退出状态

感谢您的帮助。

4 个答案:

答案 0 :(得分:14)

$ gcc -Wall -o main main.c foo.c

如果你没有告诉它,GCC不知道要找foo.c。)

答案 1 :(得分:6)

在C中创建程序需要两个步骤,编译和链接。要运行编译部分,请使用-c选项gcc

 gcc -c main.c

这会在Windows上创建一个目标文件main.o(或main.obj)。同样适用于gcc -c foo.c。在此阶段您不会收到上面的错误消息。然后将这两个目标文件链接在一起。在此阶段,符号foo已解决。您收到错误消息的原因是链接器找不到该符号,因为它只查看main.o而不是foo.o。链接器通常从gcc运行,因此要链接目标文件并创建最终的可执行文件main,请使用

 gcc -o main main.o foo.o

答案 2 :(得分:5)

您还必须编译foo.c,因为它是另一个模块。让我看看他们是如何在gcc中完成的:

$ gcc -Wall main.c foo.c -o main 

答案 3 :(得分:1)

您也可以在MakeFiles中执行此操作,如下所示:

APP_NAME = Foo
Foo_HEADERS = foo.h
Foo_FILES = main.c foo.c

如果您对MakeFiles不太熟悉,我建议您查看Make Docs,但这是一个简单的示例,APP_NAME设置已编译可执行文件的名称(在这种情况下)是Foo),Foo_HEADERS将设置应用程序使用的标头,Foo_FILES您将设置应用程序的源文件,记得将APP_NAME(在本例中为Foo)放在_HEADERS_FILES的开头。我建议你使用MakeFiles,因为它们会组织你的应用程序构建过程,对最终用户来说会更好。