2012-06-28 4 views
2

프로젝트를 컴파일하고 시스템에서 실행하면 완벽하게 작동합니다.gcc를 포함시킬 링커 옵션

나는 이것을 git에 업로드했고 내 관리자에게 서버에서 실행하도록 요청했으며 undefined reference to 'clock_gettime'이라고 말합니다. 이 오류는 라이브러리를 -lrt 옵션과 연결하여 해결할 수 있습니다. 이전에 비슷한 문제가 발생했지만 math.h 라이브러리를 -lm 옵션으로 연결하는 것과 관련이있었습니다.

모든 라이브러리를 연결하여 이러한 문제가 발생하지 않도록하고 관리자 앞에서 당황하지 않도록하는 방법이 있습니까? 모든 라이브러리를 연결할 것인지 결정하는 방법. 이것을위한 생각 과정이있을 수 있습니까?

+0

이들은 링커 * 옵션이 아니며 * 단지 * 라이브러리 *입니다. 사용하는 라이브러리를 포함해야합니다. 당신의 문서가 그것들이 무엇인지 알려줄 것입니다. –

답변

1

일부 man 페이지에는 사용할 헤더와 라이브러리가 모두 나와 있습니다. (불행히도 모든 페이지에 해당되는 것은 아닙니다.)

예를 들어 man 3 signal을 확인하십시오. 내 시스템에서 해당 페이지의 상단에 LIBRARY 섹션에는 Standard C Library (libc, -lc)이 있고 SYNOPSIS 섹션에는 #include <signal.h> 섹션이 있습니다.

일부 다른 전략은 다음과 같습니다 : 설치 라이브러리 중에서 이름에 대한 참조를 검색 할 수 쉘 루프에서 egrep에 파이프 strings

  • 블런트 사용. 이것은 일반 이름에 대해 많은 오 탐지를 반환 할 수 있지만 단일 영어 단어와 일치하지 않는 정교한 함수 이름에는 매우 잘 작동합니다.

  • 반복 컴파일 및 링크. 단일 함수를 해결하려는 경우 함수를 호출하는 작은 프로그램을 작성하고 셸 또는 makefile 루프를 사용하여 시스템의 각 단일 라이브러리를 테스트하십시오 (/usr/lib 또는 그 밖의 다른 곳에서 가장 가능성이 큰 후보 목록에서 시작). 어떤 시점에서 빌드가 성공하고 올바른 라이브러리를 보여줍니다. 이 방법은 설정하는 데 약간의 시간이 걸리지 만 사용자가 만드는 인프라는 나중에 재사용하기가 쉽습니다.

  • 은 반복적으로 당신의 링커의 도구 (예를 들어, 맥 OS X에 otool, 또는 objdump 또는 readelf Solaris 또는 Linux)를 사용하여 바이너리를 검사합니다. 예를 들어, 특정 이름 (Mac OS X에서는 otool -v -t -p _symbol)부터 시작하여 라이브러리의 텍스트 섹션을 디스 어셈블하려고합니다.

1

* nix 기반 컴퓨터의 경우 실행 파일에 ldd이 공유 라이브러리 종속성을 인쇄합니다.

+0

이것은 지식을위한 것입니다. 명시 적으로 이러한 링커 플래그를 명시 적으로 포함하는 것이 좋습니다. –

+0

@AmanDeepGautam이 질문입니까? –

+0

그렇다면 표준 라이브러리가 아닌 모든 라이브러리와 명시 적으로 링크하도록 관리자에게 알려주는 것이 가장 좋습니다. 그렇게하면 링커가 해결할 수있는 한 계속 작동합니다. –