2013-10-14 1 views
1

C 프로그래밍 언어에 대한 초보자 질문이 있습니다. 나는 비슷한 질문에 답을 찾기 위해 주변을 둘러 보았지만 그것을 이해하지는 못했습니다.다른 디렉토리의 소스 파일에서 메소드 호출

src와 test라는 두 개의 디렉토리로 구성된 간단한 프로젝트로 가정하십시오. 소스 및 헤더 파일은 src/main.c, test/foo.h 및 test/foo.c에 의해 정의됩니다.

SRC/main.c의 :

#include "../test/foo.h" 

int main (void) { 
    int a = VAR; /* works, recognizes declared macro */ 
    some_function(a); /* doesn't work, "undefined reference" */ 
} 

시험/foo.h : (중복하지만 완전하기)

#ifndef FOO_H 
#define FOO_H 

void some_function(int a);  
#define VAR 2; 

#endif 

시험/foo.c를 :

#include "foo.h" 
#include <stdlib.h> 

void some_function(int a) { 
    printf("%d", ++a); 
} 

이클립스에서 프로젝트를 만들었고 매크로도 함께 컴파일했다. 매크로가 인식되기 때문에 링크 오류가 아니라는 것을 알았지 만 호출 가능하지 않다. .

다른 디렉토리를 사용하는 이유는 파일이 많아서 내 테스트 코드가 내 주요 소스 코드와 분리되기 때문입니다. src와 test는 동일한 상위 디렉토리를가집니다.

여기에 어떤 아이디어가 있습니까? 나는 아주 명백한 것을 놓치고 있습니까?

도움이 될 것입니다, 미리 감사드립니다!

편집 : 저는 (Debian) 리눅스 컴퓨터에서 일하고 있고 이클립스는 gcc 컴파일러를 사용하고 있습니다.

edit2 : H2CO3의 답변 덕분에 실제로 링크 오류입니다. 수동으로 컴파일하고 링크 할 때마다 오버 헤드가 커지기 때문에 다른 디렉토리의 실행 파일을 링크하도록 Eclipse를 가르치는 방법을 알고 있는지 궁금합니다.

--------------------- 해결책 ---------------------

edit3 : 솔루션은 결국 매우 쉽습니다. "새로운 폴더"보다는 "새로운 소스 폴더"를 만드는 것이 었습니다. 나는 어리 석을 느낀다.하지만 특히 H2CO3에 답해 주신 모든 분께 감사드립니다!

+0

'main.c' =>'#include "../test/foo.c의 실제 소스 파일을 포함 시키십시오. " – Cyclonecode

+1

@KristerAndersson *** NO NO NO NO NOOOOOOO *** –

+0

@ H2CO3 - 작동하지 않겠습니까? – Cyclonecode

답변

2

매크로가 인식되기 때문에 링크 오류가 아니라는 것을 알았지 만이 메서드는 호출 할 수 없습니다.

비 연속. 매크로는 전처리 단계에서 확장됩니다. (따라서 링크와 전혀 관련이 없습니다.) 링커 오류가 발생했습니다.

은 당신이해야 할 일은 둘을 연결 한 후 두 파일을 컴파일, 그래서이 같은 작업을해야합니다 :

gcc -Wall -o dir_one/foo.o dir_one/foo.c 
gcc -Wall -o dir_two/bar.o dir_two/bar.c 
gcc -o my_program dir_one/foo.o dir_two/bar.o 

또한, 컴파일 과정의 방법의 단계를 이해하는 this SO question/answer 및/또는 this article 읽기 협력. (이것들은 C와 C++에서 거의 동일 합니다만, 일반적으로 다른 이름의 mangling 일뿐입니다.)

+0

답장을 보내 주셔서 감사합니다. 그러나 테스트를 실행할 때마다 두 디렉토리의 모든 파일을 컴파일해야하는 것은 상당히 비쌉니다. 필자의 후속 질문은 Eclipse에서이 링크 동작을 설정하는 방법입니다. 나는 아마도 당신이 당신의 명령 줄이나 스크립트를 사용하여 링크와 컴파일을하기 때문에 그 특별한 질문에 답할 것을 기대하지는 않는다. 그러나 답장을 보내 주셔서 감사합니다. 링크 프로세스에서 새로운 통찰력을 얻었습니다! – ShellFish

+0

BTW 아무도 내가 Eclipse에서 이러한 파일을 링크하는 데 도움이 될 수 없다면 가장 도움이 될 것입니다. – ShellFish

+0

고마워, 너는 나에게 몇 시간의 좌절감을 저장했다! – ShellFish

관련 문제