2012-04-25 6 views
5

동적으로 연결되는 두 개의 "플러그인"(토론을 위해 소프트웨어 패키지에서 두 개의 서로 다른 응용 프로그램이라고 생각 함)이 있습니다. 내 라이브러리의 두 가지 별도 빌드 버전. 내 코드는 C++로 작성되었으며 일관된 네임 스페이스를 사용합니다. 때로는 각 응용 프로그램에 대해 두 개의 다른 버전을 만들어야합니다. 패키지의 두 응용 프로그램 (플러그인) 이 동시에로드 될 때이 문제가 발생하는 것으로 보입니다. 먼저이 오류가 발생하는 이유를 이해하는 데 도움이 필요합니다.동일한 이름의 DLL 또는 다른 구현 (코드)이있는 공유 라이브러리 객체 (so)에 연결된 두 개의 플러그인

예를 들어, 두 개의 별개이지만 동일하게 이름이 지정된 라이브러리, 예를 들어 mylib.so (또는 DLL)이 있으며 각 응용 프로그램은 이들 중 하나에 연결됩니다. mylib.so의 기본 코드가 동일하면 (즉, 네임 스페이스, 함수 이름 등이 약간 다른 구현을 사용하는 경우) 이로 인해 문제가 발생해야합니까? 라이브러리의 두 사본이 모호성이나 다른 링크 오류로 인해 발생할 수있는 문제를 피하기에 충분한 고유 한 위치에 있다는 사실이 아닙니까? 나는 분명히 생각하지 않는다. 그러나 나는 이것에 대한 전문가의 말을 듣고 싶다. 설명 위의 가정

무엇이 문제, 단지 예를 들어, mylib_v1.somylib_v2.so은 모호성 오류에 대한 보호를 제공하는, 말하자면 어떤 버전 정보를 포함하는 라이브러리의 이름을 변경합니다 원인을한다 (기본 기능/네임 스페이스 이름은 여전히 ​​동일한 것) ? 나는 아직도 생각하지 않는다. 그러나 나는 이번에 확실하지 않다. 내가 옳다고 가정하면 내 매크로에서 일부 매크로를 사용하여 네임 스페이스를 변경하여 네임 스페이스에 버전 정보를 포함 시키십시오 (예 : namespace mystuff {}namespace mystuff_v1으로 변경됨). 통찰력을 고맙게 여기십시오.

참고 : 놀랍게도 모호성은 Windows에서만 발생합니다! Linux는 문제없이 두 번째 단락의 상황을 처리 할 수 ​​있습니다.

답변

2

응용 프로그램이 유일하게 하나만 사용하고 PATH 및 LD_LIBRARY_PATH가 일치하지 않도록 으로 설정되면 충돌이 없습니다. 한 번 응용 프로그램과 함께 배포 된 비슷한 msvcrt.dll 파일 수백 개가 Microsoft에서 분류 할 때까지 확인할 수 있습니다.

그러나 여전히 (약간 다른) 코드가 글로벌 리소스를 만들거나 참조 할 수 있으며 여기서는 이 충돌이 될 수 있습니다. 물론 Windows 변형은 전역 적으로 명명 된 것을 사용하지 않으며 은 여기에 다른 데이터 구조를 도입합니까? (파일을 저장 표준 설정, 공유 메모리, ...). 이 세계적인 것들은 대부분 시스템에 의존적입니다. 아마도 당신은 리눅스에서하지 않는 윈도우에서 뭔가를 할 것입니다 ...