2015-01-07 5 views
0

나는 매우 복잡한 라이브러리와 실행 파일을 가지고있다 (Linux). 과거에 정적 라이브러리를 사용하여 전체 시스템을 개발 한 후 2 년 전부터 libs가 공유 라이브러리 (-fPIC 등)로 마이그레이션되었습니다. LIBA 및 libB :서로 의존하는 공유 라이브러리 구축 (Linux)

  • LIBA는
  • libB 내가 구축하고자하는

LIBA에서 일부 함수를 호출 libB에서 일부 함수를 호출 종속성을 확인 나는이 공유 libs와이 있다는 것을, 발견 적절한 종속성을 가진 라이브러리 : libA는 libB에 의존하고 libB는 libA에 종속됩니다. lib가 libA의 빌드 타임에 아직 존재하지 않기 때문에 링커에 "-llibB"를 줄 수는 없습니다

libB의 의존성이없는 libA (미해결 심볼 생성)를 빌드하면 염두에두고 libA를 사용하면 libA에있는 정의되지 않은 기호 때문에 libB도 링크해야합니다. 그것은 annoing!

내가 찾고있는 것은 libA를 빌드하고 현재 libB가없는 libB에 의존성을 만드는 링커에게 알려주는 가능성이다.

어떻게 libA와 libB를 병합하지 않고도 내 문제를 해결할 수 있습니까?

감사합니다, 피터스


편집 : 다음

gcc -shared -Wl,-soname,libB.so.$(MAJOR) -o libB.so 

내가 할 수있는 : 나는 (소스 코드를 작성하지 않고) 내가 직접 빈 lib 디렉토리를 생성 할 수 있다는 것을 발견 libA 빌드를 빌드 명령에 -lB으로 빌드하십시오. 그 후 libB.so를 제거했습니다. 마지막으로, 설치 후 libB는 libA를 나타내고 libA는 libB를 나타냅니다.

물론 MAJOR 번호는 libB의 주요 부분과 일치해야합니다. 이는 주요 번호가 모든 libs에 공통적이기 때문에 그렇습니다.

더 적합한 방법이 있다면 나 자신에게 묻고 싶습니다.

+0

나는 디자인 실수라고 생각합니다. 'libA.so'와'libB.so'는 하나의'libAB.so'에 병합되어야합니다. –

+0

아니요, 그들은 서로 독립적으로 살아갈 수 있습니다. 내 대답은 아래에. –

+0

그들은 아마도 "독립적 일 수 있습니다"할 수 있지만 실제로는 둘 다 다른 것에 의존하기 때문에 안됩니다. –

답변

2
공유 라이브러리 사이

종속성이로드 될 때까지 해결되지 않습니다, 그래서 당신은 다음 줄에 연결할 수 있습니다

gcc -shared -Wl,-soname,libA.so.$(AMAJOR) -o libA.so 
gcc -shared -Wl,-soname,libB.so.$(BMAJOR) -o libB.so 

다음

gcc -o myProgram a.o b.o c.o libA.so libB.so 

당신이로드

(실행) myProgram의 동적 로더는 충족되지 않은 종속성을 따르고 두 공유 객체에서 심볼을 찾습니다. -shared 옵션은 실제로 해결되지 않은 기호가없는 ELF 파일을 구성 할 수있는 un-complaint-about-unresolved-symbols 플래그입니다.

여기에서 일어날 수있는 또 다른 일은 lib305가 이 설치되어 있지 않다는 것입니다.. 당신은 적절한 경로없이 실행하고 그것을 실행할 때 (myProgram에서) 미해결 된 심볼을 얻으려고합니다.하나 개의 솔루션으로 myProgram를 실행하는 것입니다 : 리눅스에서

LD_LIBRARY_PATH=. myProgram 

또는

export LD_LIBRARY_PATH=/path/to/libraries 
myProgram 

이 라이브러리가 시스템 데이터베이스에 캐시되므로 공유 라이브러리의 로딩이 빠릅니다. 데이터베이스 불리는 색인하고,

ldconfig 

다른 환경 ldconfig를 사용할 수 없습니다 루트로 명령을 ldconfig를 (8)를 사용해야 할 데이터베이스를 다시 생성 (8) 모두에서 (솔라리스는 예이다)