2014-06-06 1 views
1

어떻게해야 할 지 잘 모르겠습니다. 이에 대해 명확하지 않은 경우 의견을 말하십시오.정적 라이브러리의 정적 변수와 동적 인 DLL 비교

나는 CManager라고 불리는 커스텀 클래스를 사용하는 프로젝트를 가지고있다. 이 프로젝트의 대부분의 클래스는이 클래스에서 상속 받고 CManager() (생성자)에서 CManager 객체 수에 하나를 더합니다.이 수는이 클래스의 정적 변수입니다. 이제이 프로젝트는 .dll (동적 라이브러리)로 컴파일되었지만, 고용주는 많은 코드를 제거하면서 이번에 .lib로 컴파일하도록 요청했습니다. 이제는 필요하지 않은 코드를 모두 제거하고 오류없이 컴파일 ... 그러나 .lib를 만들 때 처리되지 않은 액세스 위반이 있다고 프로그램을 실행하려고하면 오류가 발생합니다. 독서. 여기에 코드가 있습니다

int CManager::m_count = 0; 

CManager::CManager() 
{ 
    ++m_count; <- Exception here 
} 

나는 왜이 오류가 있는지 알 수 없습니다. m_count는 .h로 선언 된 private static int 변수입니다. 왜 작동하지 않는지 이해하지 못했기 때문에 .dll로 프로젝트를 컴파일하려고 했으므로 아무 것도하지 않겠습니다. 그리고 어떤 이유로 ... 작동했습니다. 컴파일하고 실행합니다 (실행, wtv).

이제 제 질문은 ... 왜 이런 일이 발생합니까? 이게 뭐지?

PS :이 프로젝트는 5 개 다른 프로젝트 'lib 디렉토리 (또는 DLL)를 포함해야하지만 두 가지 방법을 작동합니다. 이 프로젝트는 내 메인에 포함되어 있으며, 메인을 실행하여 오류가 발생하는 경우입니다. 이 프로젝트는 알고리즘의 무리 일 뿐이며, 내 주요 응용 프로그램은 GUI입니다. 내 주요 애플 리케이션은 MFC 애플 리케이션입니다.

감사합니다.

EDIT 1 : 디버깅하는 동안 정적 라이브러리를 사용하여 프로젝트를 가져 오면 .lib 구현에 대한 주 기본 함수 호출에서 전달할 때 객체가 느슨합니다. 객체에 함수를 호출합니다. , 그리고 함수에있을 때 this (객체 참조)의 값은 null입니다. dll을 사용하면 완벽하게 작동합니다. 객체는 함수가 호출 될 때 그 값을 유지합니다.

그러나 아직도 .lib를 사용하고 싶습니다. 그래서 왜 이런 일이 일어나고 어떻게 수정해야하는지 정말로 모르겠습니다.

+1

http://stackoverflow.com/questions/5202142/static-variable-initialization-over-a-library – cageman

+0

잘 내 변수가 명시 적으로 사용되며, 그렇지? – Papsicle

+2

* "변수가 .h"에 정의되어 있다고 말할 때 * 선언 된 *과 반대로 실제로 * 정의 된 *을 의미합니까? – IInspectable

답변

0

찾았습니다. 마크 랜섬 (Mark Ransom)은 코멘트에서 문제가 코드에 없다고 말했고, 그것은 프로젝트 속성에 있었다. dll 대신 .lib를 만들었지 만 그에 따라 런타임 라이브러리를 변경하지 않았습니다. 그래서 Project Properties -> C/C++ -> All Options -> Runtime Library에서 MD를 사용하기 시작했습니다.

또한, 확인 런타임 라이브러리와 MFC의 일반적인 사용이 호환 할 내용은 here을 찾습니다. MT가 문제를 만든 방법을 아직 모르겠지만 적어도 지금은 프로그램을 실행할 수 있습니다.

+0

나는 옳다는 것을 좋아하지만,이 경우 나는 반 밖에되지 않았다. 나는 여전히 프로젝트 설정이 아니라 코드에 문제가있을 것으로 예상했다. –