2009-12-13 11 views
1

제가 만든 정적 라이브러리를 사용하는 응용 프로그램이 있습니다. 라이브러리의 한 .cpp 파일에는 정적 변수 선언이 있습니다. ctor는 단일 기능에서 함수를 호출합니다. 문자열을 추가합니다.정적 변수 초기화 코드가 호출되지 않습니다.

이제 응용 프로그램에서 해당 라이브러리를 사용할 때 내 싱글 톤에 추가 된 문자열의 흔적이없는 것 같습니다.

는 확실히 뭔가를보고 싶어하지만 난 모르는 것을 ..이의

답변

5

정적 라이브러리에있는 객체가 EXPLICITLY이 아닌 경우이 응용 프로그램에 사용되었습니다. 그런 다음 링커는 해당 객체를 lib에서 응용 프로그램으로 가져 오지 않습니다.

정적 라이브러리와 동적 라이브러리에는 큰 차이가 있습니다.

동적 라이브러리 :
컴파일 할 때 동적 라이브러리에서 아무것도 가져 오지 않습니다. 런타임에 기호를 명시 적으로로드하고 해결하기 위해 추가 코드가 추가되었습니다. 런타임에 전체 라이브러리가로드되고 객체 초기화 프로그램이 호출됩니다 (구현 세부 사항이있는 경우에도 마찬가지 임).

정적 라이브러리는 매우 다르게 처리됩니다.
정적 라이브러리에 링크하면 라이브러리에 정의 된 응용 프로그램에 정의되지 않은 모든 항목이 응용 프로그램에 풀립니다. 이것은 라이브러리가 해결할 수있는 종속성이 없어 질 때까지 반복됩니다. 이것의 부작용은 명시 적으로 사용되지 않은 객체/함수가 라이브러리에서 꺼내지지 않는다는 것입니다 (따라서 직접 액세스되지 않는 전역 변수는 꺼내지지 않습니다).

+0

당신은 그것을, 감사합니다. 사실 그것은 명시 적으로 사용되지는 않았지만 코드를 디버그 모드로 유지할 것이라고 생각했습니다. –

1

내 메모리가 약간 흐릿한,하지만 당신은 초기화 순서 문제에 박히는 될 수 있습니다. 다른 파일의 정적 변수 초기화 프로그램이 호출되는 순서에 대한 보장이 없으므로 라이브러리의 정적 변수가 초기화 될 때 아직 사용자의 싱글 톤이 초기화되지 않은 경우 사용자가보고있는 효과가 발생할 수 있습니다.

이러한 문제를 해결하는 방법은 init 명시 적으로 일종의 일을하는 것이고이 작업을 수행하는 함수이며 main 또는 그 시작 부분에서 호출하는 것입니다. 컴파일러 (또는 실제로는 링커)에 객체 파일과 라이브러리 인수를 제공하는 순서를 따라 할 수 있을지도 모르겠다. 왜냐하면 그것이 나에게도 도움이 되었기 때문이다. 그러나이 솔루션은 약간의 약점이있다. 특정 링커이지만 특정 버전 일 수도 있습니다.

+0

빠른 답변 주셔서 감사합니다. 내가 이미 그것을 분류 했으므로 그것은 확실히 순서 문제는 아니다. 임의의 수의 cpp 파일에서 임의의 수의 변수를 선언하고 런타임 프로세스에서 * generated *리스트를 선언하고자하므로 init은 편리하지 않습니다. –

0

정적 초기화를 수행하는 클래스를 리 팩터링하므로 다른 클래스에 종속되지 않습니다. 즉, 각 클래스의 초기화를 독립적이며 자급 자족하게 만듭니다.

+0

요점은, 정적 변수는 ctor 파일에 정의 된 정적 함수를 목록에 등록하기 위해서만 존재하며, 그래서 나중에 런타임에서 그 중 하나를 선택할 수 있습니다. 따라서이 상황에서 독립에 대한 개념은 없습니다. –