2011-05-05 37 views
15

我有2個文件:a.cb.cC中的「未定義的varName引用」是什麼意思?

a.c我將信號發送到位於b.c

signal(SIGUSR1,doSomething); 

的交流文件頂部的功能,我有:

extern void doSomething (int sig); 

然而,當我編譯時,我得到一個錯誤:

/tmp/ccCw9Yun.o: In function main':
a.c:(.text+0xba): undefined reference to
doSomething'
collect2: ld returned 1 exit status

以下標頭包括:

#include <stdlib.h> 
#include <stdio.h> 
#include <signal.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

我該如何解決這個問題?

+0

請顯示您的標題('.h')文件。 – 2011-05-05 02:41:39

+3

這是一個鏈接器錯誤 – 2011-05-05 02:42:28

+0

在'b.c'中實際定義了'doSomething'嗎? – Borealid 2011-05-05 02:42:52

回答

17

您需要同時連結a.ob.o

gcc -o program a.c b.c 

如果你在每個文件main(),你不能將它們關聯起來。

但是,您的a.c文件包含到doSomething()一個參考,並預計與限定doSomething(),並且不限定在a.c(如main())定義的任何功能的源文件被鏈接。

您不能從進程A調用進程B中的函數。您不能向函數發送信號;您使用系統調用kill()向進程發送信號。

signal()函數指定當前進程(程序)中的哪個函數將在進程接收信號時處理信號。

你有一些認真的工作去理解這將如何工作 - ProgramA如何知道發送信號的進程ID。 b.c中的代碼將需要調用signal()dosomething作爲信號處理程序。 a.c中的代碼只是將信號發送給其他進程。

+0

事情是.. a.c和b.c分別定義了各自的主要功能。編譯.o文件導致錯誤'main'的多重定義 – JAM 2011-05-05 02:50:45

+0

@mac好的,如果一個人要依靠另一個人的功能,你需要將他們連接在一起;如果他們有重複的功能,你需要以某種方式解決它(也許拉出'doSomething'到第三個文件中,'a.c'和'b.c'都依賴於) – 2011-05-05 02:53:05

+0

我明白了。而不是使用signal()...我用kill(pid_to_send_signal_to,handler); – JAM 2011-05-05 03:00:06

3

你得到一個鏈接器錯誤,所以你的外部工作(編譯器編譯a.c沒有問題),但是當它把目標文件鏈接在一起時,它不能解決你的外部 - void doSomething(int);在任何地方都沒有找到。你搞亂了外部嗎?確保實際上有一個在b.c定義的doSomething接受一個int並返回void,並確保你記得在您的文件列表b.c(即你正在做的事情一樣gcc a.c b.c,不只是gcc a.c

3

您需要編譯,然後鏈接目標文件是這樣的:

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

對此的最初反應是問,並確保兩個目標文件被連接在一起。

gcc -o programName a.c b.c 

或者,如果你想單獨編譯,這將是:這是在編譯階段通過在同一時間編譯兩個文件進行

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

這是非常不好的風格定義外部.c文件中的接口。 。

你應該這樣做

A.H

extern void doSomething (int sig); 

變交流

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

b.c

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

1

確保您的doSomething功能不是靜態的。

相關問題