0

我有这个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

4

3 回答 3

0

您已将头文件与err_sys. 确保您还有一个传递给链接器的实现。背景:

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

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

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

在第二步中,需要实现所有使用的功能。确保您提供了它!

(PS:一些编译器允许使用一个命令进行编译和链接,如果您有多个模块,您也许可以将它们添加到单个 gcc 调用中。不过我建议使用 make)

于 2013-06-25T11:11:15.300 回答
0

我认为可能发生的情况是您有一个标题ourhdr.h,其中包含函数的定义,但实现位于另一个文件中:ourhdr.c。在这种情况下,如果您尝试在不包含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应该工作。

于 2020-11-24T07:28:05.197 回答
-1

对我来说,如果你写的函数名写得正确,它就可以编译并正常工作。

于 2013-06-25T10:08:03.217 回答