2017-12-04 5 views
0

사용자가 컴파일하는 동안 사용 된 동일한 버전에서 내 dll 라이브러리를 사용하도록하는 표준 방법이 있습니까?다른 버전으로 컴파일 된 라이브러리 사용을 막는 방법

내가 파괴 변경 등을 추가 한 버전 1.1에서
extern "C" void A(); 

:이 기능에 또 다른 변수는 내가 가지고 :

extern "C" void A(int); 

내가 기능 버전 1.0 라이브러리가 있다고 가정하자 dll에서 내 보낸 이름은 정확히 같지만 개발자가 버전 1.1로 제품을 컴파일 한 다음 고객에게 보내면 고객이 제품 (exe 파일) 만 업데이트하면 모든 것이 실패합니다. 그리고 런타임에 임의의 지점에서 실패 할 수 있습니다 (이 변경된 기능이 언제 실행되는지에 따라 다름).

잘못된 버전으로 라이브러리를로드하는 것을 방지하는 표준 방법이 있습니까? 저는 주로 Windows dll 파일에 대한 솔루션에 관심이 있습니다. (그러나 다른 플랫폼에 고유 한 솔루션이 있다면 의견을 남겨주십시오.)

위의 예는 단순화되었습니다. C++ mangling을 추가하면 위의 특정 문제가 해결되지만보다 일반적인 해결책을 찾고 있습니다.

제 아이디어는 라이브러리 헤더 파일에 정적 객체를 추가하는 것입니다. 생성자의이 정적 객체는 라이브러리의 메서드를 실행할 수 있으며 name의 메서드는 다음과 같이 현재 버전을 인코딩합니다. init_library_1_1(); 그래서 방법이 dll에없는 경우 매우 초기에 사용자가 뭔가 잘못되었다는 것을 알 수 있습니다. 그러나이 솔루션은 더러운 해결 방법처럼 보입니다. 그리고 개발자가이 파일을 포함하도록주의해야합니다.

이러한 문제에 대해 더 좋은 해결책이 있습니까?

답변

0

표준 답변이 없지만 이러한 컴파일러/링커 쌍은 이러한 종류의 테스트를 수행하는 데 비표준 기능을 가지고 있습니다.

예를 들어 Visual C++에는 출력 개체 파일에 레코드를 저장하는 링크가 수행 될 때 레코드가 테스트되고 일치하지 않으면 오류가보고되는 "#pragma detect_mismatch"가 있습니다. DLL이로드 중에 동적으로로드되는 것이 아니라 런타임에 동적으로로드되는 경우이 작업이 효과가 있다고 생각하지 않습니다. 나는 gcc/clang이 비슷한 것을 가지고 있지만 세부 사항을 모른다고 믿는다.

+0

의견을 보내 주셔서 감사합니다. 불행히도 그것을 올바르게 이해한다면 정적 라이브러리를 연결할 때만 도움이 될 수 있습니다. 런타임에 솔루션을 찾고 있어요. 사용자가이 라이브러리를 사용하는 라이브러리와 응용 프로그램 사이의 버전이 일치하지 않습니다. – AdamF