头文件中找不到符号

时间:2013-06-25 09:58:11

标签: c header

我有这个c程序:

#include    <sys/types.h>
#include    "ourhdr.h"

int     glob = 6;       /* external variable in initialized data */
char    buf[] = "a write to stdout\n";

int
main(void)
{
    int     var;        /* automatic variable on the stack */
    pid_t   pid;

    var = 88;
    if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)
        err_sys("write error");
    printf("before fork\n");    /* we don't flush stdout */

    if ( (pid = fork()) < 0)
        err_sys("fork error");
    else if (pid == 0) {        /* child */
        glob++;                 /* modify variables */
        var++;
    } else
        sleep(2);               /* parent */

    printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
    exit(0);
}

在头文件“ourhdr.h”(位于同一文件夹中)中,我定义了几个函数,例如err_sys()。 使用gcc编译时出现此错误:

In function "main":
undefined reference to "err_sys"

我怎样才能使这个工作?如果需要,我可以在此处发布头文件。谢谢。

**编辑:**这是ourhdr.h文件:http://pastebin.com/fMUiG4zU

3 个答案:

答案 0 :(得分:0)

很抱歉将此作为答案发布,因为我无权发表评论。

如果正确编写函数名,它的工作正常。对我来说,它正在编译和工作正常。

答案 1 :(得分:0)

您已将头文件包含在err_sys声明中。确保您还有一个传递给链接器的实现。背景:

编译器将模块编译为目标文件: g++ -c modul1.c生成modul1.o g++ -c modul2.c生成modul2.o

每个模块都可以引用包含的头文件中定义的函数。到目前为止,还不需要实际实现该功能。

在下一步中,链接器链接到所有目标文件(和库): g++ modul1.o modul2.o生成./a.out或类似

在第二步中,需要实现所有使用的功能。一定要提供它!

(P.S。:有些编译器允许编译和链接一个命令,如果你有多个模块,你可以将它们添加到一个gcc调用。我建议使用make)

答案 2 :(得分:0)

我认为可能会发生的是,您有一个标头 ourhdr.h ,其中包含函数的定义,但实现位于另一个文件中: ourhdr.c < / em>。在这种情况下,如果尝试在不包含 ourhdr.c 的情况下进行编译,则会出现参考错误:

$ gcc main.c
/bin/ld: /tmp/ccVzNF6w.o: in function `main':
main.c:(.text+0x38): undefined reference to `err_sys'

要解决此问题,您需要像这样进行编译:

$ gcc main.c ourhdr.c

另一个选择是在 ourhdr.h 中定义函数的主体:

// ourhdr.h

#include <stdio.h>

void err_sys(const char* str);

void err_sys(const char* str) {
    fprintf(stderr, "%s\n", str);
}

在这种情况下,gcc main.c应该可以工作。