我有两个文件:a.c
和b.c
在a.c
中,我向位于b.c
signal(SIGUSR1,doSomething);
在a.c文件的顶部,我有:
extern void doSomething (int sig);
然而,当我编译时,我收到一个错误:
/tmp/ccCw9Yun.o:在函数
main':
doSomething'中 collect2:ld返回1退出状态
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>
我该如何解决这个问题?
答案 0 :(得分:17)
您需要关联a.o
和b.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功能不是静态的。