2010-12-27 2 views
6

는이 같은 몇 가지 시나리오가 있습니다같은 libs (이름이 같은)의 서로 다른 두 가지 버전이 응용 프로그램에 존재할 수 있습니까?

제품 -> 플랫폼에> mylibs (버전 1)

제품 -> mylibs (버전 2)

즉, 제품 mylibs (버전 2를 사용) 직접. 제품도 플랫폼 (동적 lib이기도 함)을 사용하고 플랫폼은 내 libs (버전 -1)를 사용합니다.

제품 및 플랫폼에서 사용되는 libs의 이름은 동일합니다. 버전 만 다르며 두 버전 모두 호환되지 않습니다.

Linux에서 ".so"libs를 사용하는 방법은 플랫폼이 한 버전에 링크 할 수 있으며 제품은 같은 이름을 가진 동일한 라이브러리의 다른 버전에 연결할 수 있습니까?

+0

왜 라이브러리의 이름을 변경하지 않으시겠습니까? –

답변

6

기호 이름이 충돌하기 때문에 기본적으로 libs의 이름을 변경하는 것만으로는 충분하지 않습니다. 라이브러리는 soname과 버전이있는 기호를 사용해야하며,이 경우 동일한 기호라고 부를 수도 있습니다.

$ make 
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.1 -Wl,--default-symver -o libmylibs.so.1 mylibs1.c 
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.2 -Wl,--default-symver -o libmylibs.so.2 mylibs2.c 
gcc -shared -fpic -Wl,-soname -Wl,libplatform.so.1 -Wl,--default-symver -Wl,--default-imported-symver -o libplatform.so.1 platform.c libmylibs.so.1 
gcc -Wl,-rpath-link -Wl,. -Wl,--default-imported-symver -o program program.c libplatform.so.1 libmylibs.so.2 
/usr/bin/ld: warning: libmylibs.so.1, needed by libplatform.so.1, may conflict with libmylibs.so.2 
$ LD_LIBRARY_PATH=$PWD ldd ./program 
    linux-vdso.so.1 => (0x00007fff1e3ff000) 
    libplatform.so.1 => /tmp/so-4539442/libplatform.so.1 (0x00007f6dc3ba0000) 
    libmylibs.so.2 => /tmp/so-4539442/libmylibs.so.2 (0x00007f6dc399f000) 
    libc.so.6 => /lib/libc.so.6 (0x00007f6dc364c000) 
    libmylibs.so.1 => /tmp/so-4539442/libmylibs.so.1 (0x00007f6dc344b000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f6dc3da1000) 
$ LD_LIBRARY_PATH=$PWD ./program 
lib version 2, platform lib version 1 
+0

답장을 보내 주셔서 감사합니다. 그러나이 경고 "/ usr/bin/ld : 경고 : libplatform.so.1에 필요한 libmylibs.so.1이 libmylibs.so.2와 충돌 할 수 있습니다"라는 이유를 이해하지 못했습니다. gcc가 throw합니까? – Jay

+0

gcc는 모든 심볼의 버전이 있는지 여부를 확인하지 않기 때문에 일부 충돌이 발생할 수 있음을 경고합니다. 또한 더 높은 수준에서 두 라이브러리가 동일한 리소스를 제어하려는 경우처럼 두 라이브러리가 작동 중에 충돌 할 수 있습니다. – Jester

관련 문제