2012-11-01 2 views
4

동일한 라이브러리의 여러 버전이 C++로 작성되었습니다. 나는 그들을 나란히 비교할 필요가있다. 이 라이브러리는 동일한 네임 스페이스와 함수 이름을 사용하며 동일한 매개 변수를 사용합니다.2 개의 다른 공유 라이브러리에서 같은 심볼을 가진 함수를 어떻게 호출합니까?

동시에 두 개 이상을 연결할 때 사용하는 라이브러리 버전을 제어하는 ​​방법이 있습니까?

+3

AFAIK, 여러 개의 정의 된 기호에 대해 불평하는 링커 오류가 발생합니다. 아니? –

+0

동일한 기호로 두 개의 libs를 연결할 수 없기 때문에 링커는 단순히이를 거부합니다. –

+0

음. Glibc에는 기호 버전 관리가 있습니다 (예를 들어, [이 SO 질문에] (예 : http://stackoverflow.com/questions/2856438/how-can-i-link-to-a-specific-glibc-version)), 이러한 메타 데이터를 포함하도록 라이브러리를 다시 작성할 수 있다면 도움이 될 수 있습니다. – Rook

답변

5

두 개의 라이브러리를 동일한 기호로 연결하여 둘 다 액세스 할 수 없습니다.

  • 가에 Wrapper의 구현을 정의 추상적 가상 함수
  • 을 사용하여 대상 라이브러리의 기능을 행사하는 추상 클래스 Wrapper를 정의하지만, 두 버전 라이브러리를 명확하게하기 위해 자신의 얇은 래퍼 라이브러리를 구축 할 수 있습니다 가상 방법에서 대상 라이브러리를 통해 호출 WrapperImpl라는 클래스는
  • 는 정적 라이브러리의 severa에 new WrapperImpl()
  • 컴파일 WrapperImpl을 반환하는 독립 방법 Wrapper *MakeImpl 정의 l 번, 매번 다른 버전의 대상 라이브러리와 연결됩니다. 중요 :은 을 컴파일러에 전달하고 V1, V2, V3 등과 같이 버전이 다릅니다. 여러 라이브러리로 끝나야합니다.
  • 이 시점에서 이러한 여러 라이브러리

와 메인 테스터 링크, 메인 테스터는 프리 프로세서를 통해 MakeImpl의 이름을 변경을 통해 생성 된 무료 서 기능 MakeImplV1, MakeImplV2, MakeImplV3 등등에 액세스 할 수 있습니다. 이 기능을 사용하여 다른 버전의 대상 라이브러리를 호출하는 Wrapper의 인스턴스를 얻습니다.

+0

이 래퍼 라이브러리에 대한 인터페이스를 하나의 함수 인'Wrapper * GetWrapper()'로 만들고 싶습니다. 음, 사실,'Wrapper * GetWrapperV1()'등등. 그러면 정의 대체는 라이브러리의 단일 토큰 (GetWrapper 함수의 이름)에서만 일어나야합니다. 순수 가상 래퍼 인터페이스는 (일부?) (대부분?) (모든?) C++ 링크 아키텍처 (순수 가상 클래스의 레이아웃이면 충분)에서 클라이언트가 사용할 심볼을 내보낼 필요가 없습니다. WrapperImpl은 사용자가 익스포트하지 않는 개인 구현 세부 사항입니다. – Yakk

+0

@Yakk 그게 여기서 벌어지고있는 일입니다. 'WrapperImplV1' 이름은 사용되지 않습니다 - 모든 액세스는 버전 별 라이브러리의 유일한 진입 점인'MakeImplV ' 함수를 통해 이루어집니다. – dasblinkenlight

관련 문제