2017-12-01 2 views
0

이 정적 C 라이브러리 (libabc.a)는 C++ 프로그램에 연결됩니다.정적 라이브러리를 통해 호출 된 동일한 .c 파일에 정의 된 함수에 대한 정의되지 않은 참조

내 qmake 파일에서
LIBS += pathToLib/libabc.a 정적 라이브러리를 만들 때 아무런 문제가 없었습니다. 컴파일하고 CPP 응용 프로그램을 실행 qmake를하고 gmake를 사용하는 경우 , 다른 CPP 파일의 오브젝트 파일이 생성 그러나 나는 다음과 같은 오류 얻을 수 있습니다 :

mdl.c에서 ../abc/libabc.a(mdl.o): In function 'SetExt': abc/src/mdl.c:2186: undefined reference to 'func1'

, 선언 및 정의 모두가를 .
static void func1 (int *, char *, char *);

정적 무효 FUNC1 (INT의 *의 m, 숯 * p를 숯 * s의)
{
.....
}

이 함수의 함수 호출은 C 파일 MDL에 .기음. 정적 라이브러리를 만들 때 실수를 했습니까 (gcc 및 ar 사용)? 또는, 나는 무엇을 놓치고 있냐?

+0

@Incomputable extern은 보이지 않습니다. ma 그렇지 않아. 그것은 링커가 나중에 혼란 스러울 것임을 의미합니다. 나는 당신이 말해야하는 사람이 아니다. – UKMonkey

+0

@UKMonkey, 정보 주셔서 감사합니다. 거기에 대해 읽을 리소스가 있습니까? – Incomputable

+0

@Incomputable https://stackoverflow.com/questions/1041866/in-c-source-what-is-the-effect-of-extern-c – UKMonkey

답변

1

당신은 선언 된 함수와 같은

static void func1(int *, char *, char *); 

식별자의 6.2.2 연계, 제 3 the C Standard의 당 : 따라서

If the declaration of a file scope identifier for an object or a function contains the storage-class specifier static , the identifier has internal linkage.

, func1()는 컴파일의 외부에서 액세스 할 수 없습니다 유닛 - 그것은 소스 파일에서만 사용할 수 있습니다.

+0

네, 알고 있습니다.하지만 내 의심은이 기능 그 안에 정의 된 특정 c 파일에서 호출됩니다. 그렇다면 왜 오류가 던져 집니까? mdl.c에서 func1()이 선언되고 정의되고 호출되었습니다 ...이 함수는 cpp 파일에서 호출되지 않습니다 ... – vinu960

+0

당신은이 객체 파일을 다른 프로그램에도 링크 할 수 있습니다. 그 cpp 프로그램에서 거기에 전화하지 않았습니까? – vinu960

+0

@ vinu960 코드를 어떻게 컴파일합니까? C ** 및 ** C++로 태그를 지정했지만 C 코드 만 언급됩니다. 어딘가에서 "extern"C "..."를 잊었습니까? –

관련 문제