2017-03-01 1 views
2

현재 C++에서 귀찮은 문제가 있습니다. 나의 현재의 맥락에서C++ 정적 클래스 멤버가 * 정적 라이브러리에서 초기화되지 않았습니다. *

, 우리는 주로 C++ 실행 파일 (주로 리눅스 임베디드 시스템)를 사용 :(나는 지난 20 년 동안 직면하지 않은 이유

사실

, 난 정적 이해하지 않는다 우리 고유의 정적 libs와 함께 링크. 우리가 기술 및 최적화 이유로 정적 libs와 사용합니까. 지난 몇 년 동안

, 참으로, 나는

그래서 내가 쓰기 시작 ...하지만 공유 libs와를 만드는 데 사용 정적 클래스 멤버가있는 일부 클래스. 다음과 같이 입력하십시오 :

class Inner 
{ 
public: 
    Inner() 
    { 
    std::cout << "CTOR Inner" << std::endl; 
    } 
}; 

class A 
{ 
static Inner _inner; 

... 
}; 

// in the .cpp 

Inner A::_inner; 

/////////////////////// 

매우 기본적인 유스 케이스입니까?

하지만 lib와 연결된 단위 테스트에서 콘솔에 std::cout 문을 볼 수 없습니다. 반면에 클래스 Inner와 A를 실행 가능한 소스 코드로 옮기면 잘 동작합니다.

나는 그것이 매우 기본적인 문제라고 확신하며 나는 지난 몇 년 동안 결코 직면 해 본 적이 없다는 것을 알고있다. 컴파일러와 관련된 문제입니까? Windows 및 Linux에서 두 경우를 모두 테스트했습니다 (Debian, GCC 4.9).

모든 아이디어를 환영합니다. 당신은이

Z.

+0

글로벌 변수에만 포함 된 번역 단위에서 기업의 첫 번째 ODR 사용하기 전에 초기화를 보장합니다. TU를 사용하지 않으면 전역 초기화를 보장 할 수 없습니다. –

+0

확인. 그래서 나는 "적절하게"초기화를 강제하는 해결 방법을 찾아야한다 ... 좋다. – Zyend

+0

실제 사용 사례는 무엇입니까? 정적 라이브러리에 단순하게 링크하는 것만으로도 부작용이 없다는 기대에 부합됩니다. 만약 내가 무언가를 사용하지 않는다면, 나는 그것을 지불 할 필요가 없어야한다. 그것은 C와 C++의 디자인 원리이다. – zett42

답변

7

실제로 :: _ 코드를 어떻게 든 내부 또는 일부가 포함되지 않습니다를 사용합니다. 그 중 하나 또는 그 파일에서 다른 것을 사용하십시오. 링커는 부작용이 관찰 되더라도 사용되지 않는 번역 단위로 링크 할 필요가 없습니다.

How to force inclusion of "unused" object definitions in a library

+0

당신은 당신의 닉을 정말로 존중합니다! 내 모든 존경심. –

+0

감사. 음 ... 언뜻보기에는 그 문제를 해결할 "깨끗한"해결책이 없습니다. 나는 가능한 한 모든 것을 더럽게 만들 것이므로 #pragma 문장의 팬이 아니다. – Zyend

+0

기본적으로 라이브러리 헤더/매크로에서 "DECLARE_FILE (x)" "DEFINE_FILE (x)"을 허용하는 일부 매크로를 정의했다. cpp 그리고 나서 "USE_FILE (x)"을 내 프로그램의 메인에 넣습니다. 이것들은 externed 된 static int를 생성하고 main에 할당 될 것이다. 이로 인해 번역 단위가 포함되어 등록이 이루어졌습니다. 어쨌든 그와 같은 것, 내가 한 일을 구체적으로 기억하지 마십시오. –

관련 문제