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

我有2个文件: acbc

ac我向位于bc的function发送信号

 signal(SIGUSR1,doSomething); 

在ac文件的顶部,我有:

 extern void doSomething (int sig); 

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

/tmp/ccCw9Yun.o:在函数main':
ac:(.text+0xba): undefined reference to
main':
ac:(.text+0xba): undefined reference to
main':
ac:(.text+0xba): undefined reference to
doSomething的main':
ac:(.text+0xba): undefined reference to

collect2:ld返回1退出状态

包括以下标头:

 #include  #include  #include  #include  #include  #include  

我该如何解决?

你需要链接aobo

 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不是静态的。