전역 변수와 정적 변수가있는 모듈이 응용 프로그램에 동적으로 연결될 때 어떤 일이 발생하는지 이해하려고합니다. 모듈이란 솔루션의 각 프로젝트를 의미합니다 (저는 Visual Studio와 함께 많은 일을합니다!). 이러한 모듈은 * .lib 또는 * .dll 또는 * .exe 자체에 내장되어 있습니다.동적 라이브러리가 링크 될 때 공유 라이브러리의 전역 변수와 정적 변수는 어떻게됩니까?
응용 프로그램의 바이너리는 데이터 세그먼트의 모든 개별 번역 단위 (개체 파일)의 전역 및 정적 데이터를 포함한다는 것을 알고 있습니다 (const 인 경우 읽기 전용 데이터 세그먼트).
이 응용 프로그램이로드 시간 동적 연결을 사용하는 모듈 A를 사용하면 어떻게됩니까? DLL 전역 및 정적에 대한 섹션이 있다고 가정합니다. 운영 체제에서로드합니까? 그렇다면 어디서로드됩니까?
그리고 응용 프로그램이 런타임 동적 링크로 모듈 B를 사용하면 어떻게됩니까?
내 응용 프로그램에 A와 B 둘 다 사용하는 두 개의 모듈이있는 경우 아래에서 언급 한대로 (다른 프로세스 인 경우) A와 B의 전역 복사본이 생성됩니까?
DLL A와 B는 응용 프로그램 전역에 액세스합니까?
MSDN에서 인용 (당신의 이유뿐만 아니라하시오) : 컴파일러에 의해 전역 변수로 취급되는 DLL 소스 코드 파일에서 글로벌로 선언 된
변수와 링커를 사용하지만 주어진 DLL을로드하는 각 프로세스는 해당 DLL의 전역 변수 사본을 가져옵니다. 정적 변수의 범위는 정적 변수가 선언 된 블록으로 제한됩니다. 결과적으로 각 프로세스는 기본적으로 DLL 전역 변수와 정적 변수의 자체 인스턴스를 갖습니다.
및 here에서
:모듈을 동적으로 링크 할 때, 그것은 다른 라이브러리 전역의 자신의 인스턴스를 가지고 있는지 또는 전역가 공유 불분명 할 수 있습니다.
감사합니다.
* 모듈 별 * 아마도 * libs *를 의미합니다.C++ 표준에 * modules *을 추가하는 제안이 있습니다. 모듈은 모듈의 정의와 현재의 정규 라이브러리와 다른 의미를 정의합니다. –
아, 그건 분명히 했어야합니다. 나는 다른 프로젝트를 솔루션으로 생각한다. (나는 Visual Studio와 함께 많은 일을한다.) 모듈로 생각한다. 이러한 모듈은 * .lib 또는 * .dll에 내장되어 있습니다. – Raja
@ DavidRodríguez-dribeas "모듈"이라는 용어는 실행 가능 프로그램, 동적 링크 라이브러리 (.dll) 또는 공유 개체 (.so)를 포함하여 독립 실행 형 (완전히 링크 된) 실행 파일에 대한 올바른 전문 용어입니다. 여기서는 완벽하게 적합하며 그 의미는 정확하고 잘 이해됩니다. 앞서 설명한대로 "모듈"이라는 표준 기능이있을 때까지는 모듈의 정의가 그대로 유지됩니다. –