C中“对varName的未定义引用”是什么意思?

时间:2011-05-05 02:39:58

标签: c reference undefined

我有两个文件: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>

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:17)

您需要关联a.ob.o

gcc -o program a.c b.c

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

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

您无法从进程A调用进程B中的函数。您无法向函数发送信号;您使用main()系统调用向进程发送信号。

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

你有一些认真的工作要做,了解它是如何工作的 - ProgramA将如何知道将信号发送到哪个进程ID。 signal()中的代码需要使用b.c作为信号处理程序调用{​​{1}}。 signal()中的代码只是将信号发送到另一个进程。

答案 1 :(得分:10)

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

你应该这样做

A.H

    extern void doSomething (int    sig);

交流转换器

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

b.c

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

答案 2 :(得分:4)

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

gcc -o programName a.c b.c

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

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

答案 3 :(得分:3)

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

答案 4 :(得分:3)

您需要编译然后链接目标文件,如下所示:

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

答案 5 :(得分:1)

确保您的doSomething功能不是静态的。