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

Jam*_*sev 15 c reference undefined

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

a.c我发送信号到位于的功能b.c

signal(SIGUSR1,doSomething);
Run Code Online (Sandbox Code Playgroud)

在ac文件的顶部,我有:

extern void doSomething (int    sig);
Run Code Online (Sandbox Code Playgroud)

但是,当我编译时,我收到一个错误:

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

包括以下标题:

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

Jon*_*ler 17

你需要链接两个a.ob.o:

gcc -o program a.c b.c
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

您有一些认真的工作要做,了解它是如何工作的 - ProgramA将如何知道将信号发送到哪个进程ID.在代码b.c的人都需要调用signal()dosomething作为信号处理程序.代码a.c只是将信号发送到另一个进程.


mat*_*tnz 10

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

你应该做这个

    extern void doSomething (int    sig);
Run Code Online (Sandbox Code Playgroud)

AC

    void doSomething (int    sig)
    {
       ... do stuff 
    }
Run Code Online (Sandbox Code Playgroud)

公元前

#include "a.h"
.....
signal(SIGNAL, doSomething); 
Run Code Online (Sandbox Code Playgroud)

.