나는 추상적 인 방법으로 문제를 공식화하려했지만, 결국 실제 라이브러리에 대한 세부 정보를 제공합니다.중복 된 동적 및 정적 링크 (Firefox Add-on, WebRTC 및 VP8)
동적 라이브러리 Addon
정적으로 다른 라이브러리 어셈블리의 일부 코드가 WebRTC
에 링크되어 오브젝트가 WebRTC
의 자신의 오브젝트 파일과 함께 파일로이 코드는 WebRTC
로 연결되어 있습니다. 이 어셈블리 코드 VP8
을 호출 할 수 있습니다. VP8
의 기능은 WebRTC
안에 extern
으로 표시됩니다. 일부 기능 Encode()
은 Addon
에서 WebRTC
의 기능을 호출하며 결국 VP8
에서 기능을 호출합니다.
이제 라이브러리 Addon
를로드하는 것입니다 응용 프로그램 Firefox
은 매우 복잡하고 라이브러리 WebRTC
의 (정적으로 링크 된 의미) 자신의 버전이 (의이 WebRTC2
를 부르 자), 그러나 이전 하나.
그래서, 여기에 문제가 있습니다 : Encode()
의 통화가 응용 프로그램 Firefox
만든 경우 WebRTC
시도가 VP8
함수를 호출 할 때, WebRTC
기능 (올바르지 않습니다 WebRTC2
) 하지만을 호출되는, 그들은에서 호출되는 WebRTC2
버전 (응용 프로그램의 버전은 WebRTC
을 의미 함)은 WebRTC
이 아니라.
WebRTC
VP8
의 로컬 복사본에서만 전화를 걸 수 있습니까?
응용 프로그램 Firefox
는 파이어 폭스 브라우저, WebRTC
는 WebRTC가 라이브러리, VP8
은 (WebRTC가 내부)는 VP8 코덱 라이브러리 및 Addon
내 파이어 폭스는 C++ 추가합니다. -
UPDATE 상세한 설명
가 여기에 문제의 "unabstract"설명입니다 가 그래서 C가 ++ XPCOM 추가에있는 정적의 WebRTC 라이브러리의 최신 버전에 연결되어 있습니다. 애드온 내부의 어떤 지점에서 프레임 인코딩을위한 호출이 이루어지며 (방법 Encode
은 VP8Encoder
클래스) 항상 Firefox에서 충돌하며 gtest 프레임 워크를 사용하는 테스트 프로그램에서 계속 작동합니다.
WebRTC 내부의 어떤 지점에서이 어셈블리 코드의 인코딩 및 기능을 호출하는 VP8 어셈블리 코드가 구현 파일에 extern
으로 선언되어 있습니다. 실제로, 그것은 vp8_intra_pred_y_ve_sse2
함수에서 충돌합니다. 필자는이 함수의 세 가지 어셈블리 코드를 비교했습니다. 하나는 WebRTC (애드온에 사용)의 두 번째 버전이고 다른 하나는 디버거가 충돌 한 곳이며 세 번째는 Mozilla의 WebRTC 소스 코드입니다.
모질라의 코드가 애드온의 WebRTC 대신에 호출되는데 (둘 다 같은 이름의 코스가 있음) Mozilla의 WebRTC 코드가 오래된 것으로 밝혀지면서 EXC_BAD_ACCESS와 충돌합니다.
사실, 물건을 "unabstract"하려고하십시오. 머리 글자에서 계속 추적 할 필요가있는 단일 문자 이름 대신 실제 이름을 사용하는 것이 이해하기 쉽습니다. (나는 결국 이해했지만 제공 할 답변은 없습니다). 또한, 물건이 어떻게 빌드 (링크)되고 어떤 메커니즘 (윈도우 DLL 로더, ld 등)을로드 할 것인가와 같은 많은 세부 사항을 생략했는데, 이것들은 모두 달라질 수 있습니다 ... 또한, 이것은 파이어 폭스 애드온 (firefox addon) 문제처럼 보이지만, 일반적인 동적 로더 문제와 비슷합니다. – nmaier
예, 일반적인 문제입니다. 그럼에도 불구하고 세부 정보로 설명을 업데이트했습니다. – peetonn