2011-05-05 2 views
15

내가 2 개 파일이 : 나는 교류 파일의 상단에 b.cC에서 "varName에 대한 정의되지 않은 참조"는 무엇을 의미합니까?

signal(SIGUSR1,doSomething); 

에있는 함수에 신호를 보낸다 a.ca.c에서 b.c

을, 내가 가진 :

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') 파일을 보여주십시오. –

+3

이것은 링커 오류 –

+0

입니다.'doSomething'은 실제로'b.c'에 정의되어 있습니까? – Borealid

답변

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의 코드는 단순히 다른 프로세스로 신호를 보냅니다.

gcc -c a.c 
gcc -c b.c 
gcc a.o b.o -o prog 
+0

문제는 .. a.c와 b.c는 각각 각각의 주 함수를 정의합니다. .o 파일을 컴파일하면'main '이라는 다중 정의 오류가 발생합니다. – JAM

+0

@mac 음, 다른 파일의 기능에 의존하려면 함께 링크해야합니다. 그들이 중복 함수를 가지고 있다면 어쨌든 그것을 해결할 필요가있다. (아마도'doSomething'을'a.c'와'b.c' 둘 다에 의존하는 세번째 파일로 끌어 들일 것이다.) –

+0

알았다. 대신 signal() 사용 ... 나는 kill (pid_to_send_signal_to, handler); – JAM

3

링커 오류가 발생하여 extern이 작동합니다 (컴파일러는 a.c이 문제없이 컴파일 됨). 그러나 오브젝트 파일을 함께 연결하면 extern을 확인할 수 없습니다. - void doSomething(int); 실제로 어디서나 발견되지 않았습니다. 너는 외부인을 망 쳤니? 있는지 실제로 확인 int를 받아 void을 반환하고, b.c에 정의 된 doSomething 거기 확인 당신이 당신의 파일 목록에서 b.c (즉 당신이 아니라 gcc a.c, gcc a.c b.c 같은 일을하고있는)

3

는이 같은 오브젝트 파일을 링크 한 후 컴파일해야합니다.외부 정의하는 아주 나쁜 스타일

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

이에 대한 초기 반응은 물어 두 개의 오브젝트 파일이 서로 연결되고 있음을 확인하는 것입니다 :

10

:

gcc -o programName a.c b.c 

아니면 개별적으로 컴파일하려면, 그것은 다음과 같습니다이 동시에 두 파일을 컴파일하여 컴파일 단계에서 이루어집니다 .c 파일의 인터페이스. .

당신은 A.C

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

b.c

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

a.h

extern void doSomething (int sig); 

을해야한다.

1

doSomething 함수가 정적이 아닌지 확인하십시오.

관련 문제