C中“对varName的未定义引用”是什么意思?
我有2个文件: ac
和bc
在ac
我向位于bc
的function发送信号
signal(SIGUSR1,doSomething);
在ac文件的顶部,我有:
extern void doSomething (int sig);
但是,当我编译时,我收到一个错误:
/tmp/ccCw9Yun.o:在函数
main':
ac:(.text+0xba): undefined reference tomain':
ac:(.text+0xba): undefined reference tomain':
doSomething的
ac:(.text+0xba): undefined reference tomain':
‘
ac:(.text+0xba): undefined reference to
collect2:ld返回1退出状态
包括以下标头:
#include #include #include #include #include #include
我该如何解决?
你需要链接ao
和bo
:
gcc -o program ac bc
如果每个文件中都有一个main()
,则无法将它们链接在一起。
但是,您的ac
文件包含对doSomething()
的引用,并且期望与定义doSomething()
的源文件链接,并且不定义在ac
定义的任何函数(例如main()
)。
您无法从进程A调用进程B中的函数。您无法向函数发送信号; 您使用kill()
系统调用向进程发送信号。
signal()
函数指定当您的进程接收信号时当前进程(程序)中的哪个函数将处理信号。
您有一些认真的工作要做,了解它是如何工作的 – ProgramA将如何知道将信号发送到哪个进程ID。 bc
的代码需要使用dosomething
作为信号处理程序来调用signal()
。 ac
的代码只是将信号发送到另一个进程。
在.c文件中定义外部接口是非常糟糕的风格。 。
你应该做这个
啊
extern void doSomething (int sig);
AC
void doSomething (int sig) { ... do stuff }
公元前
#include "ah" ..... signal(SIGNAL, doSomething);
。
对此的初步反应是询问并确保将两个目标文件链接在一起。 这是在编译阶段通过同时编译两个文件来完成的:
gcc -o programName ac bc
或者如果你想单独编译,它将是:
gcc -c ac gcc -c bc gcc -o programName ao bo
你得到一个链接器错误,所以你的extern工作(编译器编译ac
没有问题),但是当它最终将目标文件链接在一起时它无法解析你的extern – void doSomething(int);
实际上没有找到任何地方。 你搞砸了外面的人吗? 确保实际上在bc
中定义了一个doSomething
,它接受一个int
并返回void
,并确保你记得在你的文件列表中包含bc
(即你正在做一些像gcc ac bc
,而不仅仅是gcc ac
)
您需要编译然后链接目标文件,如下所示:
gcc -c ac gcc -c bc gcc ao bo -o prog
确保你的doSomethingfunction不是静态的。