如何在这个小程序中包含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退出状态
感谢您的帮助。
答案 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,因为它们会组织你的应用程序构建过程,对最终用户来说会更好。