为什么CC没有在标题中看到我的函数定义?

时间:2010-10-15 21:35:08

标签: c gcc

我正在用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的引用未定义”。这是一个链接问题吗?如何正确使用我的标题?

谢谢!

4 个答案:

答案 0 :(得分:6)

您需要同时编译两个源文件:

cc main.c foo.c -o main

此外,在这种情况下,-o会生成一个可执行文件,因此调用它main.o可能会产生误导。


又一个小问题,虽然与问题无关:#ifndef中的#definefoo.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中编译或链接定义。您的标题错误地使用了术语定义