2012-07-20 5 views
0

나는 어색하다. 리눅스의 공유 라이브러리와 이상한 문제가 발생했습니다. 나는 성공적으로 공유 라이브러리를 생성하고 librbmp.so.0 파일을 얻은 다음 심볼릭 링크를 통해 파일 두 개를 더 얻습니다 : librbmp.solibrbmp.so.0.0.1. 그럼 나는 /usr/local/lib에 복사하고 ldconfig을 실행하고 이상한 행동으로 만났습니다 - 하나 더 파일이 /usr/local/lib에 나타납니다. --library=ibrbmp.so.0.0.1이라고합니다. 이상한 점은 런타임 중에 응용 프로그램에 연결된다는 것입니다.심볼릭 링크 이상한 문제

누구나 무슨 일이 일어나고 있고 내 앱이 librbmp.so에 연결되도록해야합니까?

//creating shared library 
$(CC) -shared -Wl,-soname,-librbmp.so.0.0.1 $(OBJECTS) -o librbmp.so.0 -lc 

//symlinking 
ln -sf librbmp.so.0.0.1 librbmp.so.0 
ln -sf librbmp.so.0.0.1 librbmp.so 
+0

.so를 만드는 데 사용 된 연결된 명령 줄은 무엇입니까? –

+0

@ MichaelKrelin-hacker가 요청한 코드를 추가했습니다. – Robin92

답변

2

런타임에 응용 프로그램에서 사용하는 이름은 링크 타임에 라이브러리에 포함되어

여기에 코드 조각입니다. 그래서 당신의 빌드 과정에서 뭔가 이상한 명령 행 인자가 링커에 도입되었습니다.

gcc을 링커 프론트 엔드로 사용하는 경우, 인수가 -Wl,-soname=librbmp.so.0이어야한다고 가정합니다. 전화를 걸면 -이 문제의 원인 일 수 있습니다. 실제로는 -l의 모든 인스턴스를 --library=으로 바꿔서 실제 링커를 호출 한 다음 -soname=--library=ibrbmp.so.0.0.1을 볼 것입니다.

또한 soname은 일반적으로 API 수준 호환성을 나타내는 양식을 지정해야합니다. 그래서 귀하의 경우, soname은 librbmp.so.0이어야하고 실제 출력 오브젝트 파일은 librbmp.so.0.0.1이어야합니다. 그렇게하면 라이브러리를 향상시킬 때 버전을 증가시킬 수 있으며 바이너리 호환성을 손상시키지 않는 한 응용 프로그램은 계속 작동합니다. ABI를 깰 때, soname을 librbmp.so.1에 부딪쳐 야합니다.

+0

고맙습니다. 그래서 내 문제를 없애 내 실수를 바로 잡을 수 있었다 :) – Robin92