【问题标题】:What does the "undefined reference to varName" in C mean?C中的“未定义的varName引用”是什么意思?
【发布时间】:2011-08-19 00:31:33
【问题描述】:

我有 2 个文件:a.cb.c

a.c 中,我正在向位于b.c 的函数发送信号

signal(SIGUSR1,doSomething);

在 a.c 文件的顶部,我有:

extern void doSomething (int    sig);

然而,当我编译时,我得到一个错误:

/tmp/ccCw9Yun.o:在函数main':
a.c:(.text+0xba): undefined reference to
doSomething'
collect2: ld 返回 1 个退出状态

包括以下标题:

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

我该如何解决这个问题?

【问题讨论】:

  • 请显示您的标头 (.h) 文件。
  • doSomething 是否真的在 b.c 中定义?

标签: c reference undefined


【解决方案1】:

您遇到链接器错误,因此您的 extern 正在工作(编译器编译 a.c 没有问题),但是当它最后将目标文件链接在一起时,它无法解决您的 extern -- void doSomething(int); 实际上并没有在任何地方找到。你搞砸了外部?确保实际上在b.c 中定义了一个doSomething,它接受一个int 并返回void,并确保你记得在你的文件列表中包含b.c(即你正在做类似gcc a.c b.c ,而不仅仅是gcc a.c)

【讨论】:

    【解决方案2】:

    您需要同时链接a.ob.o

    gcc -o program a.c b.c
    

    如果每个文件中都有main(),则不能将它们链接在一起。

    但是,您的 a.c 文件包含对 doSomething() 的引用,并希望与定义 doSomething() 的源文件链接,并且未定义在 a.c 中定义的任何函数(例如 main() )。

    你不能从进程 A 调用进程 B 中的函数。你不能向函数发送信号;您使用kill() 系统调用向进程发送信号。

    signal() 函数指定当您的进程接收到信号时,当前进程(程序)中的哪个函数将处理该信号。

    您需要做一些严肃的工作来了解这将如何工作 - ProgramA 将如何知道将信号发送到哪个进程 ID。 b.c 中的代码将需要调用 signal() 并使用 dosomething 作为信号处理程序。 a.c 中的代码只是将信号发送给其他进程。

    【讨论】:

    • 问题是 .. a.c 和 b.c 各自定义了各自的主要功能。编译 .o 文件导致 `main' 的多重定义错误
    • @mac 好吧,如果一个要依赖另一个函数,则需要将它们链接在一起;如果他们有重复的功能,你需要以某种方式解决它(也许将doSomething 拉到a.cb.c 都依赖的第三个文件中)
    • 我明白了。而不是使用信号 ()... 我使用了 kill(pid_to_send_signal_to, handler);
    • 这个答案的第一行启发了我的解决方案。在使用 Makefile 的大型程序中,确保包含您新创建的每个源文件!
    【解决方案3】:

    您需要像这样编译然后链接目标文件:

    gcc -c a.c  
    gcc -c b.c  
    gcc a.o b.o -o prog  
    

    【讨论】:

      【解决方案4】:

      对此的最初反应是询问并确保两个目标文件被链接在一起。这是在编译阶段通过同时编译两个文件来完成的:

      gcc -o programName a.c b.c
      

      或者如果你想单独编译,那就是:

      gcc -c a.c
      gcc -c b.c
      gcc -o programName a.o b.o
      

      【讨论】:

        【解决方案5】:

        在 .c 文件中定义外部接口是非常糟糕的风格。 .

        你应该这样做

        啊。

            extern void doSomething (int    sig);
        

        交流

            void doSomething (int    sig)
            {
               ... do stuff 
            }
        

        b.c

        #include "a.h"
        .....
        signal(SIGNAL, doSomething); 
        

        .

        【讨论】:

          【解决方案6】:

          确保你的 doSomething 函数不是静态的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-10-28
            • 2013-12-26
            • 2013-07-21
            • 2011-04-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多