내가 좋아하는 "초기화"클래스의 번호와 세계지도를CPP 파일은
std::map<long, std::string> Global_ID_Mapper;
을 초기화하기 위해 노력하고있어 무시된다 애플리케이션 시작 중에 자동으로 매핑됩니다. 그래서 내 cpp 파일 중 하나에서 "init"클래스의 전역 변수를 정의합니다.
// AGlobalMapperInitializer.cpp
AGlobalMapperInitializer AGlobalMapperInitializer_Value;
매퍼 채우기는 AGlobalMapperInitializer_Value
작성의 부작용입니다.
문제는이 전역 변수를 제외하고 cpp에 아무 것도 포함되어 있지 않으면 링커에서 cpp를 명백히 무시한다는 것입니다. 유용한 일부 다른 코드를 cpp에 넣거나 (비어 있지 않은 일부 cpp에 전역 이니셜 라이저를 정의 할 때) 생성자가 호출되고 전역 매퍼가 채워집니다. 그러나 cpp가 다른 파일에서 참조되지 않는 전역 만 포함하는 경우 cpp가 컴파일되고 obj 파일에 변수가 들어 있지만 링커는 링크 중에이를 언급하지 않고 exe에서 빠뜨립니다.
어떻게하면 exe에 cpp를 연결하도록 고집 할 수 있습니까? 일부 pragma 또는 dummy 코드를 cpp에 입력하여 무시하지 않습니까? 나는 x
같은 파일 (실제로 번역 단위)로부터 함수 나 변수가 어느 참조하지 않을 경우 2012 년
일반적인 대체 방법 중 하나는 처음 사용할 때 전역/싱글 톤을 초기화하는 것입니다. – MooseBoys
(Dll) 전체 클래스 AGlobalMapperInitializer를 내보내고 클래스의 정적 멤버를 전역으로 만들거나 클래스 외부에서 extern (Dll) Export로 헤더에 전역을 선언 할 수 있습니다. (그렇지 않으면 전역은 트랜 슬 레이션 유닛의 로컬이고 최적화 됨) –
링커는 참조되지 않은 모든 객체를 버립니다. 내보낼 수없는 내보내기를 선언하는 것 외에는 어떤 함수에서나이를 참조 할 수 있습니다. 컴파일러가'main() {printf ("", & AGlobalMapperInitializer_Value)}처럼이 참조를 최적화 할 수 없도록주의하십시오. }' – harper