我正在用ANSI C编写一个简单的应用程序。我在Unix环境中使用GCC。
我有以下示例应用程序:
//main.c
#include "foo.h"
int main()
{
int result;
result = add(1,5);
return0;
}
部首:
//foo.h
#ifndef FOO_H_INCLUDED
#define FF_H_INCLUDED
int add(int a, int b);
#endif
实现:
//foo.c
int add(int a, int b)
{
return a+b;
}
我正在使用以下命令编译我的程序:
cc main.c -o main.o
编译器抱怨“对add
的引用未定义”。这是一个链接问题吗?如何正确使用我的标题?
谢谢!
答案 0 :(得分:6)
您需要同时编译两个源文件:
cc main.c foo.c -o main
此外,在这种情况下,-o
会生成一个可执行文件,因此调用它main.o
可能会产生误导。
又一个小问题,虽然与问题无关:#ifndef
中的#define
和foo.h
不匹配。
答案 1 :(得分:1)
标题不是您当前的问题。您当前的问题是您没有在add
中编译foo.c
函数定义。
尝试
cc main.c foo.c -o main.o
答案 2 :(得分:0)
如果您尝试将main.c编译为已组装的目标文件,则需要阻止gcc尝试链接。这是通过
完成的cc -c main.c -o main.o
您可以编译所有其他目标文件,然后当您准备好所有目标文件时,只需执行
cc main.o obj1.o anotherOBJ.o -o myExecutableBinary
答案 3 :(得分:0)
“未定义的引用”是链接器错误,而不是编译器错误。
编译器在标头中看到声明,但您尚未在foo.c中编译或链接定义。您的标题错误地使用了术语定义。