2010-03-29 8 views
0

일반적으로 동적으로 링크해야하는 라이브러리의 경로가 LD_LIBRARY_PATH에 정의되어 있거나 이진 파일을 만드는 동안 -L 플래그로 언급됩니다.동적 연결 : 연결 경로 변경

실제로 시나리오에서 바이너리가 빌드되어 클라이언트 위치에 배포되었다고 가정합니다. 이제 동적 연결 라이브러리 경로 중 하나의 경로가 변경된 경우. 그러면 바이너리가 배포 된 모든 클라이언트에 새로운 make 파일을 제공해야합니다.

우리는 모든 클라이언트에게 makefile을 바꾸라고 말할 필요가없는 다른 방법이 있으며 코드 자체에서 어떤 것을 할 수 있습니까? 그렇다면 ... 아무도 제안 할 수는 없습니까?

이것은 아이러니하게도 내가 묻는 인터뷰 질문이었고 나는 그 대답을 찾지 못했습니다.

편집 : : 메이크 파일을 건드리지 않고 코드에서 수행 할 수있는 작업에 대해 구체적으로 질문했습니다.

+0

LD_LIBRARY_PATH는 연결과 관련이 없습니다. 런타임 전용입니다. –

답변

0

MYLIBPATH과 같은 환경 변수를 사용하고이 변수를 하드 코딩 된 값이 아닌 makefile에서 사용하십시오.

그래서 모든 클라이언트는 자신의 디렉토리 구조를 가질 수 있으며 정확하게 MYLIBPATH을 지정하는 한 프로그램이 올바르게 빌드됩니다.

또는 당신이

LIBPATH = $(shell find/-name libmylib.a -exec dirname {} ";" -quit) 

myprog: myprog.c 
     $(CC) myprog.c -lmylib -L$(LIBPATH) 

EDIT처럼, 당신의 메이크에 도서관도 찾아보실 수 있습니다 : find로 대체locate-quit 옵션 보통

+0

예 .. 이건 실제로 내 답변이었습니다 ...하지만 이것은 패널에 의해 합의되지 않았습니다. 그들은 코드에서 수행 할 수있는 sth을 원했습니다. – Vijay

+0

은 리눅스에서만'locate' 명령이 있습니까? – Vijay

+0

업데이트 된 답변보기 - POSIX'find'를 사용하므로 모든 Unix에서 정상이어야합니다 – qrdl

1

경우에만 LD_LIBRARY_PATH을 변경해야합니다으로 단지 첫 경기를 반환 하드 코딩 된 검색 경로가 포함 된 컴파일과 관련이없는 경우가 아니면 rpath입니다.