2011-02-12 2 views
2

TagLib 라이브러리를 사용하는 간단한 C 프로그램을 작성하고 있습니다. 원래는/usr/local에 라이브러리를 설치하고 그것을 컴파일하고 링크했습니다. 이후로 라이브러리를 완전히 제거하고 다른 위치에있는 라이브러리의 컴파일 된 버전과 연결을 시도하고 있습니다. 문제는 내가 지금 프로그램을 컴파일 할 때 깨끗하게 컴파일되지만 실행하려고 할 때 내 프로그램은 새로운 위치 대신/usr/local/lib에 있었던 라이브러리를 찾고 있습니다. 예를 들어, 내 코드와 새 TagLib 라이브러리는/Users/mdi/Code/태그에 있습니다.Mac gcc가 기존의 존재하지 않는 라이브러리와 연결을 시도 중입니다.

나는이처럼 내 프로그램을 컴파일하고 있습니다 :

cc main.c -Wall -I./taglib/bindings/c -o tag -L./taglib/bindings/c/.libs -ltag_c 

내가 말했듯이, 컴파일은 오류 또는 경고와 함께 완료됩니다. 바이너리를 실행하려고 할 때, 나는이 오류를 얻을 : 이진 쇼에 'otool -L'을 실행

dyld: Library not loaded: /usr/local/lib/libtag_c.0.dylib 
Referenced from: /Users/mdi/Code/tag/./tag 
Reason: image not found 
Trace/BPT trap 

을이 왜 여전히 태그 라이브러리 라이브러리를 사용하려고

tag: 
/usr/local/lib/libtag_c.0.dylib (compatibility version 1.0.0, current version 1.0.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1) 

그/usr/local/lib에 더 이상 존재하지 않으며 더 중요한 것은 어떻게 해결할 수 있습니까?

답변

0

도움 주셔서 감사합니다. 사실, 불행히도 이러한 솔루션 중 어느 것도 작동하지 않았습니다. 더 많이 파고 들자 마자, 새로 빌드 된 라이브러리가 'otool -L'에 의해보고 된 것처럼 이전 경로를 사용하고있는 것으로 나타났습니다. libs에 이미 빌드 된 후에 install_name_tool -id /new/path/to/lib newly_built_lib을 사용하여이 문제를 해결했습니다.

이것은 문제를 해결하는 것처럼 보입니다. 그러나 lib에 대한이 오래된 경로가 완전히 제거 된 후에도 왜 아직도 매달려 있는지 궁금합니다 (매달린 심볼릭 링크 없음). 나는 또한 성공하지 않고 sudo update_dyld_shared_cache -force을 시도했다. 하지만 어쨌든 도움을 주셔서 감사합니다.

+0

좋아, 이제 나는 이해하기 시작했다. 내가 무슨 일이 일어나고 있는지 설치 경로 (어디'lib 디렉토리에 설치 될 것입니다'설치)'lib 디렉토리에 표시되는 것입니다'otool - L에 의해보고됩니다. –

2

Mac에서 개발하지는 않지만 귀하의 라이브러리가 기본 동적 링크 경로에 위치하지 않는다고 생각됩니다. 그것은 플랫폼에 따라 다르지만,/usr/local/lib는 그 중에서도 공통적 인 부분입니다. 그래서 런타임에 링크하는 경로로 표시됩니다.

샤드 라이브러리에 대한 기본 검색 경로는 변경할 수 있지만 Mac에서는이를 수행하는 방법이 확실하지 않습니다. 세션 내에서 환경 변수 DYLD_LIBRARY_PATH를 설정하여 dyld가 기본 디렉토리를 검색하기 전에 다른 디렉토리를 강제로 검색하도록 할 수 있어야합니다. 시스템 레벨에서 기본 검색 경로에 디렉토리를 추가

%> export DYLD_LIBRARY_PATH=/path/to/your/library:$DYLD_LIBRARY_PATH 

변수 솔루션 위의 환경보다 더 나은,하지만 난 Mac에서이 작업을 수행하는 방법의 인식입니다.

편집 : 약간의 검색 후

, 나는 당신이 가능성이 도움이 있습니다이 link을 발견했다.

+0

내 솔루션과 같은 생각 ... 이것은 먼저 테스트 할 사람입니다. 이 방법이 효과가 있다면,'rpath'를 라이브러리에 설정하면 제 답변에 나와있는 것처럼 영구적 인 해결책이 될 것입니다. – DarkDust

1

먼저/usr/local/bin에 매달린 심볼릭 링크가 없는가? 그렇다면이 라이브러리가 컴파일/링크 된 방법을 모르므로이 방법을 알려 줄 수는 없지만 -rpath 링커 옵션을 추가해보십시오. 예를 들어 :

gcc -o libtag_c.0.dylib ... -Wl,-rpath,/Users/mdi/Code/tag 

그 옵션은 라이브러리 다음 라이브러리에 대한 해당 경로에서 검색합니다 런타임 링커에 대한 명시 적 검색 경로를 추가합니다.

관련 문제