2009-09-23 2 views
1

"미디어 플레이어"부분에 대해서는 자세히 설명하지 않을 것입니다. 사실은로드되는 간단한 동적 라이브러리가 될 플러그인을 사용한다는 것 외입니다. 런타임에. 이제, 나는 그 플러그인들을 그들의 의존성에 동적으로 링크시킬 수 있거나 정적으로 그것들을 링크시킬 수있다. 둘 다 장점과 단점이 있습니다. 여기서는 리눅스를 포함하지 않습니다. 공유 라이브러리를 사용하기 때문입니다.미디어 플레이어의 정적 라이브러리와 공유 라이브러리

공유 라이브러리를 사용할 때 나타나는 이점 중 하나는 라이브러리가 프로그램과 독립적으로 업데이트 될 수 있다는 것입니다. Windows에서는 공식적인 C++ ABI 덕분에 라이브러리가 응용 프로그램 옆에 있으므로 이점이 거의 없습니다. Windows에서 DLL 지옥을 줄이고 C 라이브러리를 공유하려면 SxS를 사용해야합니다. SxS는 정말 멋진 시민은 아닙니다.

정적 라이브러리의 경우 링크 타임 최적화와 같은 큰 장점이 있습니다. ICC와 VC++에서 꽤 오래 동안 지원해 왔으며 GCC는 그들을위한 지회를 가지고 있습니다. Windows에서 VC++을 사용하고있을 것이기 때문에 컴파일러 (실제 "컴파일러"는 C++을 중간 언어로 변환하므로 컴파일러는 "링커"이므로)의 성능이 눈에 띄게 향상 될 것입니다. 코드를 작성하고 이런 식으로 많은 것을 최적화 할 수 있습니다. 이것은 제가 기울이고있는 선택입니다.

내 질문에 내 의 특정 사례에서 가장 좋은 질문은 무엇입니까?

OS X에 대한 지식이 없어도이 Linux에서 셀 수는 없으므로 다른 응용 프로그램에 신경 쓰지 않아도됩니다 (어쨌든 동일한 미디어 플레이어를 두 번 실행하는 사람)? 바이너리 호환성 (응용 프로그램으로 모든 것을 배포 할 예정이므로) 또는 쉽게 업데이트 할 수 있습니다 (Windows에서는 매우 효율적인 이진 diff 패치를 사용하여 업데이트를 배포합니다).

답변

0

귀하의 "구체적인"사례가 무엇인지 확실하지 않습니다.

귀하의 "미디어 플레이어"가 귀하의 완전한 감독하에 한 번에 모든 미디어 플레이어를 업데이트 할 수있는 잘 아는 유일한 클라이언트 (또는 작은 클라이언트 세트)를위한 것이라면 나는 정적 라이브러리.

그렇지 않은 경우 동적 라이브러리를 사용할 것입니다. 최적화는 좋지만 고객/사용자 만족만큼 좋지는 않습니다. xxx 라이브러리를 최신 버전으로 업데이트하는 것보다 더 나쁜 것은 없으며 모든 갑작스런 일이 중지됩니다. 업데이트가 가능한 시점과 방법을 자유롭게 제어 할 수없는 경우 주석에

응답 : 정적 링크는 구체적인 버전에 의존 할 수 있으며, 다른 릴리스에 연결하려고하면 깰 수있는 반면

일반적으로 동적 라이브러리는 마이너 릴리스 버전에 대한 이전 버전과 호환됩니다. Dynamic Linking을 사용하면 정적 호출이 라이브러리의 함수 오프셋 변경에 의존하는 반면 사용하는 호출은 변경되지 않는 한 프로그램이 작동 할 수도 있습니다.

예를 들어, 정적 라이브러리는 정적 오프셋에서 프로세스의 주소 공간에 런타임에로드 될 수 있습니다. 물론이 오프셋을 알고 있으면 특정 최적화가 가능하지만 라이브러리를 업데이트하면 해당 라이브러리를 사용하는 모든 플러그인을 업데이트하거나 기능이없는 오프셋 된 플러그 인이 작동하지 않을 수 있습니다.

정적 링크가 대기 중일 수있는 경우 런타임에로드한다고 가정합니다. 다른 경우에는 각 플러그인에 라이브러리가 있고 "공유"되지 않습니다.

+0

오픈 소스 플레이어입니다. 동적 라이브러리로 업데이트하는 방법은 무엇입니까? 정적 라이브러리를 사용하는 경우 "xxx 라이브러리를 최신 버전으로 업데이트"하면 응용 프로그램이 중단 될 수 있습니다. 나는 다른 방향으로 말할 것입니다. – CMircea

+0

정적 라이브러리는 동일한 소스에서 생성되므로 공유 라이브러리와 마찬가지로 하위 호환이 가능합니다. 최신 버전을 사용하려면 라이브러리를 다시 컴파일하고 다시 링크해야합니다. 실제로는 문제가 아닙니다. 플러그인이 콜백 디자인을 갖기 때문에 주소 공간 오프셋이 어떻게 영향을 줄 수 있는지는 알지 못합니다. (즉, 프로그램에 의존적이어서 Qt가됩니다.) 어쩌면 플러그인으로 사용할 수 있도록 공유 라이브러리의 모든 일반 응용 프로그램 코드를 내보낼 것입니다. 그러나이 경우에는 정말 유용하지 않습니다. – CMircea