2009-06-10 2 views
0

내가 작업하고있는 프로그램은 ThirdPartyLibrary.lib에 정적으로 링크되어 있습니다.리눅스 용 코드에서 다른 버전의 라이브러리 믹싱

3rdPartyLibraryNewVersion.lib과 같은 3rdPartyLibrary의 최신 버전을 활용하고 싶습니다.

따라서 3rdPartyLibraryNewVersion.so를 동적 링크 라이브러리로 포함하여 wrapper.so라는 래퍼 동적 라이브러리를 통해 포함시킵니다. 우리는 3rdPartyLibrary의 새 버전과 구 버전을 동시에 사용할 수 있지만 프로그램의 다른 부분에서 사용하기를 희망합니다.

우리가 가진 해결책은 이전 3rdPartyLibrary를 정적으로 링크하고 동시에 3rdPartyLibraryNewVersion에 래퍼 라이브러리에 동적으로 링크하는 것입니다.

프로그램 --- 정적으로 연결됨 ---> 3rdPartyLibrary.lib. --- 동적 링크 -> 래퍼 .so --- 동적 링크 ---> 3rdPartyLibraryNewVersion.so.

이것이 가능합니까?

우리가 만난 문제는 wrapper.so가 테스트 실행 파일로 작업하는 동안 ThirdPartyLibrary.lib에 정적으로 링크 된 프로그램에서 래퍼가 호출 될 때 3rdPartyLibraryNewVersion.so에서 실패했습니다.

내가 잘못 했습니까?

나는 그것이 실패 방법 당신은 말할 것도 게을리 ... 올바른 방법이 3rdPartyLibrary.lib 우리의 코드를 업데이트하는 것입니다하지만 너무 지루

감사합니다,

답변

0

을 알고 귀하의 래퍼 구성표를 사용하여 ...

하지만 당신은 아마도 일이 실패하거나 예기치 않은 방식으로 행동하게 네임 스페이스 충돌로 실행됩니다.

옳은 일을 알고 있습니다. 코드를 업데이트하십시오. 너무 지루한 경우 코드가 노력할 가치가 없어야합니다. 새로운 기능으로 코드 작업을해야 할 필요가 있다면, 업데이트 할 가치가 있습니다. 마지막으로 원하는 것은 동일한 라이브러리의 서로 다른 호환되지 않는 두 버전에 묶여있는 상황을 만드는 것입니다. 당신이 나중에 그것을 유지해야한다면 당신은 스스로를 차버 릴 것이다. 다른 누군가가 그것을 유지해야한다면, 그들은 당신을 사냥하여 당신을 때릴 것입니다. 올바른 방법으로하십시오.

+0

나는 우리가 미끄러운 길을 가고 있다는 것을 알고 있지만, 대체 길은 쉽지 않습니다. 경우에 따라 gdb에 따라 프로그램의 코어 파일이 3rdPartyLibraryNewVersion.so에 크래시 된 프로그램임을 나타냅니다. ThirdPartyLibraryNewVersion의 내부 호출은 SIGSEGV가 전송되기 전에 만들어졌습니다. 네임 스페이스 충돌을 자세히 설명 할 수 있습니까? 링크 된 래퍼 라이브러리는 3rdPartyLibraryNewVersion을 호출합니다 (또는 내가 생각하기에), 프로그램이 혼란스럽고 정적으로 링크 된 라이브러리라고 불리는 것을 의미합니까? –