2011-12-09 1 views
2

일부 기능의 경우 다른 정적 라이브러리 libbar에 의존하는 정적 라이브러리 libfoo를 가정하십시오. 이러한 응용 프로그램과 내 응용 프로그램은 D로 작성됩니다. 응용 프로그램이 libfoo를 직접 사용하고 libbar에서 기호를 참조하지 않는 libfoo의 함수 만 호출하는 경우 링커에 libbar를 전달하지 않고 프로그램을 성공적으로 연결하는 경우가 있습니다.사용되지 않는 기능에 대한 링커 오류 : 언제 발생합니까?

어떤 컴파일러가 GCC 툴체인을 사용하여 링크하더라도 libfoo, libbar 및 내 응용 프로그램을 컴파일하는 데 사용하는 컴파일러에 따라 이러한 문제가 발생할 수 있습니다. DMD를 사용하고 있다면 libbar를 링커에 전달하지 않으면 절대로 링커 오류가 발생하지 않습니다. GDC를 사용하는 경우 이해가 안되는 경우가 있기 때문에 때때로 수행합니다. LDC를 사용하고 있다면, 나는 항상 그렇게한다.

libfoo에서 참조 된 기호가 정의되지 않았지만이 기호가 응용 프로그램 개체 파일에서 참조하지 않는 함수에서 발생하면 GCC 링커가 실패할지 여부를 결정하는 것은 무엇입니까?

답변

1

libfoo로 지칭되는 심볼이 정의되어 있지만,이 심볼은 애플리케이션 객체 파일에 의해 참조되지 함수에서 발생할 때 GCC 링커 실패 여부를 판정 무엇? 링커가 해결되지 않은 기호에 대해 불평하면

후 그 어딘가에서 참조 기호 입니다.

일반적으로 링커에서 확인할 수없는 참조가 어떤 개체에서 왔는지 알려주지 만 그렇지 않은 경우에는 -Wl,-y,unres_symbol이어야합니다.

이 모든 내용이 어떻게 작동하는지이 description을 읽을 수도 있습니다.

+0

오른쪽. 기호는 내 응용 프로그램에서 참조되지 않은 장소에서만 참조됩니다. 그래프에 관해서는 응용 프로그램의 코드에서 정의되지 않은 심볼까지의 경로가 없어야합니다. – dsimcha

+0

"경로가 없어야합니다 ...". 그러나 요점은 * 경로가 있다는 것입니다 (또는 링커가 실패하지 않았을 것입니다). * 정확한 * 오류 메시지는 무엇입니까? –

1

링커는 단순히 가 사용되는 모든 참조 기호를 가정 라이브러리에서 죽은 (사용하지 않은) 코드를 제거하는 노력을하지 않고,이 예 A의를 통해 (제거를 수행하는 경우

에서 그들을 연결하려고하면 간단한 마크와 청소 너 한테 (그 문제는 중단 문제로 환원 될 수 완전히 일부 코드가 사용되지 않는 경우를 결정할 수 있습니다))은이 동작을 구현 그들이

를 사용하지 않을 경우 사용되지 않는 라이브러리를 제거 할 수있다 정의되어 있습니다 (en/disable로 설정할 수있는 링커 플래그가있을 수 있습니다)

관련 문제