문제

나는 내가 발전하는 도서관 A를 가지고있다. 컴퓨터에 배치하면 해당 liba.so 그리고 Liba-Xyzso /usr /lib에 넣습니다 (xyz는 버전 번호입니다).

이제 A를 사용하는 라이브러리 B를 개발합니다. B를 연결하면 플래그 -LA를 사용합니다. 그 다음에 "ldd libb.so"나에게 준다 :

(...)
libA-X.Y.Z.so => /usr/lib/libA-X.Y.Z.so
(...)

내 문제는 A (Xyzz)의 새 버전을 출시 할 때 B의 새 버전을 출시해야한다는 것입니다. 그렇지 않으면 최신 A를 설치하는 사람이 B 버전 XYZ를 찾고있는 B를 설치할 수 없습니다. 존재하지 않습니다.

이 문제를 어떻게 해결합니까? liba-xyzso가 아닌 liba.so를 찾도록 B에게 어떻게 알릴 수 있습니까? 아니면 그렇게하는 것이 잘못입니까? 안전하지 않습니까?

업데이트 1 : 라이브러리 A (다른 사람으로부터 상속 된)는 자동 툴을 사용합니다.

업데이트 2 : 라이브러리 A를 만들 때 다음을 볼 수 있습니다. "-wl, -soname -wl, liba-0.6.1.so". 내가 제대로 이해한다면 그것은 우리가 Soname을 강요하고 있음을 의미합니다. liba-0.6.1.so. 맞습니까? 이제 내 문제는 Autotools를 사용하는 프로젝트 에서이 동작을 수정하는 방법이 없다는 것입니다. 한동안 검색했지만 유용한 정보를 찾을 수 없습니다. configure.in 또는 makefile.am을 수정해야합니까?

도움이 되었습니까?

해결책

liba.so를 만들 때 -soname 옵션을 링커로 전달하십시오 (GCC를 통해 링크하는 경우 -wl, -soname을 사용). 그런 다음 B가 연결되면 링커는 파일 이름을 통해서가 아니라 Soname을 통한 A를 지칭합니다. 대상 시스템에서 Soname에서 실제 파일로 링크가 있는지 확인하십시오. 보다

http://www.linux.org/docs/ldp/howto/program-library-howto/shared-libraries.html

다른 팁

이것은 또한 창에서 "dll hell"로 작동합니다 :).

B가 특정 버전의 A가 필요하고 liba-xyz가 아닌 Liba에 연결하면 Liba를 최신 버전으로 대체하면 B가로드되거나 충돌하지 않을 수 있습니다.

그러나 물론 Liba-xyz에서 Liba-x1.y1.z1까지의 심포 링크를 수행 할 수 있습니다. API가 변경되지 않고 구현 만 안전 해야하는 경우 안전해야합니다.

두 번째 업데이트에 대한 답변 : liba의 makefile.am에서 _la_ldflags에서 수정했습니다. -풀어 주다 에게 -혈전. 이로 인해 버전 번호가없는 공유 라이브러리가 생성 된 후이 비공개 공유 라이브러리와 성공적으로 연결된 LIBB를 다시 컴파일했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top