【问题标题】:Symbol not found in header file头文件中找不到符号
【发布时间】:2013-06-25 09:58:11
【问题描述】:

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

【问题讨论】:

  • 你在哪里定义err_sys()
  • “未定义引用”是链接器错误。您需要链接到包含符号的库/目标文件。
  • 确保正在构建具有 'err_sys' 定义的文件。
  • @DanielFischer 我该怎么做?包含符号的文件是ourhdr.h,err_sys在该文件中定义。
  • 如果我们可以在头文件中写int main(int argc, char** argv); 然后包含它,我们的程序就会神奇地表现出来并做我们想让他们做的事情。唉,我们实际上必须编写代码,但err_sys 的代码不明显。你从某个地方得到了“ourhdr.h”;您还需要获取随附的源代码或编译后的库。

标签: c header


【解决方案1】:

您已包含带有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】:

    我认为可能发生的情况是您有一个标头 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 应该可以工作。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-08-27
        • 2011-06-17
        • 1970-01-01
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多