2011-06-11 2 views
1

ARM 용 SourceryGpp lite를 사용하여 응용 프로그램과 라이브러리를 개발 중입니다.ctor init이 라이브러리의 전역 ctor 인스턴스를 호출하지 않음

표준 라이브러리 또는 기본 시작 파일을 사용하지 않습니다. 그래서 내가 다음 코드로하고있어 글로벌 클릭률 (CTR)을 호출 :

ldr r0,=__ctors_init__ 
ldr r0,[r0] 
mov lr,pc 
bx r0 

그래서 문제는 정적 라이브러리에서 일부 글로벌 인스턴스를 정의 해요,하지만 그들의 ctors가 위의 코드에 의해 호출되지 않습니다이다 . 이상한 점은 응용 프로그램의 전역 ctors가 성공적으로 호출되었으므로 누구나 이유를 알 수 있습니까?

답변

5

이것은 런타임 초기화와 함께 정적 라이브러리 및 전역 변수에서 잘 알려진 문제입니다.

대부분의 링커는 주 프로그램의 종속성을 충족시키는 데 필요한 정적 라이브러리의 구성 요소 만 포함합니다. 컴파일 단위의 개체가 하나도 사용되지 않으면 을 제거합니다. 은 전체적으로 컴파일 단위 인을 추가하지 않으며 전역 초기화의 부작용이 발생하지 않습니다.

좋은 설명 here (최종 요약 here)

있다 당신은 표준 라이브러리에서 제공하는 시작 코드와 같은 문제가있을 것입니다.

+0

하지만 응용 프로그램 코드없이 정적 라이브러리 인스턴스를 참조하면이 문제에 대한 해결책이 있습니까? – DVD

+0

@DVD : 유니티 빌드는 그것을 해결합니다 (라이브러리에 오직 하나의 컴파일 유닛이 있기 때문에). 라이브러리를 제거하고 명령 행에서 라이브러리를 구성하는 모든 파일을 전달하는 것은 잘 작동합니다. 물론 메인 프로그램의 변수를 참조 할 수 있으므로 링크 타임에 가져올 수 있습니다. –

+0

ok thkz ben과 답글을위한 ybungalobill – DVD

3

표준 명시 적 ([basic.start.init, C++ 98) 정적 객체 초기화를 연기 할 수있게 :

그것은 여부 동적 초기화 (8.5, 9.4 구현 정의되고 12.1, 12.6.1)은 네임 스페이스 범위의 객체가 main의 첫 번째 명령문보다 먼저 수행됩니다. 초기화가 메인의 첫 번째 문장 다음에 어떤 포인트 으로 지연되면, 초기화 될 객체와 동일한 번역 단위에 으로 정의 된 함수 나 객체를 처음 사용하기 전에 초기화가 발생합니다.

은 (최신 C++ 0X 초안은 조금 다른 표현이 있습니다.)

당신이에서 모두 약간의 번역 단위를 사용하지 않는 경우에 따라서, 모든 개체가 완전히이 제거 될 수 있습니다 정의.

+0

좋은 점 (+1). 그가 쓰는 코드는 연기가 이루어져야하는 곳이지만, 그의 경우에는 연기가 없다. 링커가 라이브러리에서 해당 번역 단위를 가져 오지 않았기 때문에 이니셜 라이저는 전역 초기화 목록에만 없습니다. –

관련 문제