2013-07-15 2 views
1

나는 a.c b.cpp 파일을 가지고 있습니다. 다음과 같이"fun2()"에 대한 정의되지 않은 참조

/****** a.c ******/ 
fun1(...) 
{ 
    .......... 

    fun2(...); /* function present in b.cpp */ 

    .......... 
} 

/******* b.cpp *******/ 
extern "C" int fun2(...); 
int fun2(...) 
{ 
    .......... 

} 

나는 코드를 컴파일 :

a.o:a.c b.o 
    gcc -c -o a.o a.c b.o 

b.o:b.cpp 
    g++ -c -o b.o b.cpp 

을하지만 정의되지 않은 참조를 "Fun2에()"로 오류를 받고 있어요. 올바른 방법입니까? 아니면 아무것도 바꾸어야합니까?

+0

fun2의 forward 선언과 fun2의 정의가 동일한 인수를 갖고 있는지 확인하십시오. 동일한 gcc가 있으면 오류없이 컴파일해야합니다. – loentar

+0

rems4e가 대답 했으므로 함수 프로토 타입이 필요합니다. 그러나 당신의 연결은 잘못되었습니다. 'gcc -c a.o a.c && g ++ -c b.o b.cpp && g ++ -o myprogram a.o b.o' –

+0

rems4e가 100 %에서 올바르지 않습니다. 모든 "알 수없는"C 함수에는 암시 적 선언이 있습니다. http://stackoverflow.com/questions/4914589/c-prototype-functions를 참조하십시오. 헤더 파일을 포함하거나 직접 선언하여 'fun2'프로토 타입을'a.c'에 추가 할 수 있지만 이것은 선택 사항입니다. cpp에서'extern "C" "를 선언하면'fun2'라는 기호가'b.o'에 나타나며, 링커는 그 기호를 볼 것입니다. – loentar

답변

3
extern "C" int fun2(...); 

당신은 함수가 "C"연결이 있는지 확인하기 위해 그것을 알려주는 함수가 정의되어있는 곳입니다 b.cpp에서 그 라인을 가지고 있지만, 당신은 그것을 말할 교류에 해당하는 프로토 타입이없는 그 기능이 존재한다는 것.

/****** a.c ******/ 
extern int fun2(...); 
fun1(...) 
{ 
    .......... 

    fun2(...); /* function present in b.cpp */ 

    .......... 
} 

을 수정합니다. 또는 헤더에 넣으십시오.

// b.h 
#pragma once 

// tell c++ you want these externs to have C linkage 
#ifdef __cplusplus 
extern "C" { 
#endif 

// list your "C" accessible functions here. 
extern int fun2(...); 

// end the extern scope 
#ifdef __cplusplus 
}; 
#endif 

// a.c 
#include "b.h" 

// b.cpp 
#include "b.h" 
+1

정확하지 않습니다. 함수가'extern "C"'가되도록 b.cpp에 필요합니다. a.c에서는 'extern "C"가 아니라 프로토 타입 만 필요합니다. –

+0

정말 아닙니다 .. C 컴파일러는 "extern"을 알지 못합니다 – loentar

+0

@NikosC. 네. 포스트에 올린 직후 바로 고쳤습니다. – kfsone

5

a.c에 함수의 프로토 타입을 추가해야합니다.

1

왜 오브젝트 파일에서 오브젝트 파일을 구성합니까? b.o를 a.o에 링크 할 필요없이 각 객체를 해당 c에서 빌드하고 끝에있는 모든 것을 링크합니다 (main() 함수 사용).

관련 문제