문제

내가 만든 정적 라이브러리를 사용하는 응용 프로그램이 있습니다. 라이브러리의 .CPP 파일 하나에는 정적 변수 선언이 있으며 CTOR는 싱글 톤에서 기능을 호출하여 문자열을 추가합니다.

이제 응용 프로그램에서 해당 라이브러리를 사용할 때 싱글 톤에는 추가 될 문자열의 흔적이 포함되어 있지 않습니다.

나는 확실히 뭔가를 놓치고 있지만 무엇을 모른다 ..

도움이 되었습니까?

해결책

정적 라이브러리에 객체가없는 경우 명시 적으로 응용 프로그램에 사용됩니다. 링커는 해당 객체를 LIB에서 응용 프로그램으로 당기지 않습니다.

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

다이나믹 라이브러리 :
컴파일 시간에 동적 라이브러리에서 아무것도 가져 오지 않습니다. 추가 코드가 추가되어 런타임에 기호를 명시 적으로로드하고 해결합니다. 실행 시간에 전체 라이브러리가로드되어 객체 초기화기가 호출됩니다 (구현 세부 사항은 경우).

정적 라이브러리는 매우 다르게 처리됩니다.
정적 라이브러리에 링크하면 라이브러리에 정의 된 응용 프로그램에서 정의되지 않은 모든 항목을 애플리케이션으로 가져옵니다. 이것은 라이브러리가 해결할 수있는 더 이상 종속성이 없을 때까지 반복됩니다. 이것의 부작용은 명시 적으로 사용되지 않은 객체/함수가 라이브러리를 형성하지 않는다는 것입니다 (따라서 직접 액세스하지 않은 글로벌 변수는 당기지 않습니다).

다른 팁

이것에 대한 나의 기억은 약간 흐릿하지만, 초기화 순서 문제에 부딪히게 될 것입니다. 다른 파일의 순서 정적 변수 초기화기가 호출되는 보장은 없으므로, 라이브러리의 정적 변수가 초기화 될 때 싱글 톤이 아직 초기화되지 않은 경우,보고있는 효과가 발생할 수 있습니다.

내가이 문제를 해결하는 방식은 일종의 명시적인 것을 갖는 것입니다. init 이 작업을 수행하고 내가 시작할 때 부르는 기능 main 또는 뭔가. 객체 파일 및 라이브러리 인수를 컴파일러 (또는 링커)에게 제공하는 순서로 바이올린으로 바이올린을 사용하여 나에게도 효과가 있었기 때문에 그 솔루션은 약간 깨지기 쉽습니다. 특정 링커이지만 아마도 특정 버전 일 수도 있습니다.

정적 초기화를 수행하는 클래스를 리팩터하여 다른 클래스에 의존하지 않습니다. 즉, 각 클래스의 초기화를 독립적이고 자급 자족하게 만듭니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top