2011-12-22 3 views
11

공유 라이브러리에 따라 앱에 문제가있는 것으로 나타났습니다 : 종속성이 누락 된 경우 사용자가 종속성 기능을 사용할 의사가 없더라도로드 시간이 일 때 앱이 실패합니다.선택적 공유 라이브러리

내 앱이 더 좋기를 바랍니다. n 개의 다른 패키지를 배포하는 것보다 이상적으로 이상적으로, n = numberOfSupportedArchitectures * numberOfSupportedOS * Π (각 공유 라이브러리) (대안 수) "공유 라이브러리를로드하는 동안 오류가 발생했습니다"예외가 발생했습니다. 로드 타임에 라이브러리가 필요하지만 필요하지는 않지만 - 발견되지 않으면 관련성이없는 링크를 사용하는 것을 피하는 방식으로 실행을 계속합니다. 그러나 분명히 예외는 없습니다. 누락 된 것이 있으면 main()이 시작되기 전에 모두 사라집니다.

로드 프로세스를 제어하는 ​​데 가장 가까운 것은 모든 링크를 dlopen, dlsym 등으로 직접 해결하는 것입니다. 너무 귀찮다. 이미 저를 위해 도서관을 이용할 수 있었으면 좋겠습니까?

이것은 소스 기반 배포판이나 Windows에서는 문제가되지 않습니다. 태그에 바이너리 패키지를 넣으려고했지만 분명히 동전 태그에 대한 담당자가 없었습니다.

'는 OS의 로더/링커 동작을 수정하는 데있어 가장 우아한 해결책 인 것처럼 보입니다.

답변

0

공유 라이브러리를 직접 포함하고 -rpath $ORIGIN을 통해 링커 검색 경로를 조정할 수 있습니다.

+0

또는 환경 변수'LD_LIBRARY_PATH'를 설정하는 스크립트를 통해 프로그램을 실행하십시오. – rodrigo

+0

라이브러리를로드하는 대신 다른 버전의 라이브러리 만 사용할 수 있습니다. 완전히 다른 인터페이스를 갖거나 전혀 제공되지 않으며 제공하는 기능이 UX에만 표시되지 않습니다. 비록 이것이 부재 라이브러리를 처리 할 수있는 방법을 제공 할 수도 있지만; 필자는 누락 된 대상과 동일한 인터페이스를 사용하여 불필요한 공간 라이브러리를 만들 수 있습니다. 여기서 대상이 누락되면 링커는 무언가에 연결할 필요성을 충족시킬 수 있습니다. 어리석은 것 같다. – mako

2

weak symbols을 살펴볼 수 있습니다. 그러나 이것은 C 또는 C++ 표준의 일부가 아니기 때문에 컴파일러에 조금 의존합니다. 그러나 GCC를 위해 간다면, 그것은 당신을 위해 일할 것입니다.

+0

라이브러리의 헤더에있는 모든 기호에 대해 비활성 본문을 정의 할 필요가 없습니까? – mako

+1

아닙니다. 심볼의 존재 여부를 테스트 할 수 있습니다. 'void foo();'가 있으면 다음과 같이 호출 할 수 있습니다 :'if (foo) foo();' – Krizz

+0

Ah. 그러나 나는 그들을 약한 상징으로 모두 선언해야 할 것인가? – mako