2013-08-02 4 views
0

누군가 나에게 설명 할 수 있습니까? 다음과 같이링커가 정의되지 않은 함수 참조를 말합니다.

파일 A는 : fun1에 정의되지 않은 참조 :

file b.c 
static int fun1(); 
int fun1(){ 
    printf("fron fun1"); 
    return 0; 
} 

내 코드를 컴파일하려고하면 컴파일러가 오류를 제공합니다

file a.c 
#include <stdio.h> 
#include <stdlib.h> 

int fun1(); 
int main() 
{ 
    fun1(); 
    return 0; 
} 

파일 B는 다음과 같이 기록됩니다. 파일 b.c에서 fun1 정적을 선언하면 무엇을 의미합니까?

+3

'static '은 함수의 범위가 여러분이 선언 한 모듈 (file)로 제한된다는 것을 의미하므로'b.c' 파일에서'static' 선언을 제거해야합니다. 'b.c'에있는'static' 선언으로'fun1'는'a.c'에 접근 할 수 없습니다. – lurker

+1

링커 오류가 아닌 컴파일러 오류입니까? – Dabbler

+0

컴파일하는 데 사용하는 명령 줄을 게시하십시오. @Dabbler가 말한 것처럼 당신은 아마도 링커 오류를보고있을 것입니다. –

답변

3

fun1을 b.c에 static으로 선언하면 외부에서 볼 수 없으므로 컴파일 단위 b.c.에서만 사용할 수 있습니다. static을 삭제하십시오.

참고 : 코드를 컴파일하려면 bcc 상단에 #include <stdio.h>을 추가해야합니다. a.c

extern int fun1(); 같은 주에

+0

시도해 보셨습니까? 여전히 컴파일러 오류가 발생합니다. –

+0

'printf'는'b.c'에 임포트되지 않았습니다. 그러나 그것은 문제가 아닙니다. – flyx

+0

링커 오류가 발생하고 컴파일러 오류가 발생하지 않습니다. – stev

0

사용 extern : fun1()는 기본적으로 외부 링크가 있습니다. 사용

제거 static int fun1();

b.c에서 컴파일 : 잘

gcc -o test a.c b.c

+0

'extern'은 선택 사항이며 컴파일에 거의 영향을 미치지 않습니다. – flyx

+0

@flyx ouhh 예, 단지 가독성을 위해, 나는 가지고 있지 않아야합니다. 감사합니다. – P0W

+0

가독성은 좋은 것으로 언급할만한 가치가 있습니다. 가독성에 관해서는 헤더 파일을 구현 파일의 외부 선언보다 선호합니다. – flyx

0

, 당신은 파일 b.c에서이 동작을 요구하고있다. 당신이 함수 같은 static를 선언 할 때

는, 그 기능은 그것을 다른 말로 만 b.c 사용할 수 있습니다 때문에 존재하고 b.c의 기능이 선언 된 것 같은 번역 단위에 볼 수 있습니다.

그래서 당신의 링커이 아닌 옵션으로 b.c 내부의 기능을 고려하고이 코드에 다른 구현이 기호를 해결할 수 없기 때문에이 정의되지 않은 참조를 남긴다.

0

컴파일러 오류 이유 : 파일 "a.c"에서 fun1() 함수에 대한 정의가 없습니다.

용액 1 :

declare fun1() as extern in "a.c" : extern int fun1(); 

해결책 2 :

Add #include "b.c" in "a.c" 
0

static 함수 정의한 즉 해당 파일이 그 변환 유닛에 로컬로 볼 수있다.

그렇기 때문에 컴파일러 (링커)가 해당 함수의 정의를 찾을 수 없습니다. static 키워드를 제거하십시오.

컴파일의 경우 함수 프로토 타입 만 있으면 충분하지만 연결하는 동안 컴파일하는 동안 존재한다고 주장한 함수가 다른 파일에 있는지 확인해야합니다.그러나 이것을 static으로 선언함으로써 함수의 정의를 해당 파일로만 제한하고 필요로하는 (호출하는) 파일에는 보이지 않게 할 수 있습니다.

관련 문제