2009-10-14 2 views
0

MS-Visual Studio 2005를 사용하여 모든 C 코드와 함께 작업 공간을 만들었습니다. 호출되지 않지만 컴파일 된 함수를 많이 봅니다. 어떤 컴파일 타임 매크로 하에서도 컴파일 할 수 없게한다).MS VS-2005 사용되지 않는/실행되지 않은 코드를 제거하지 않는 컴파일러 최적화

내가 그 사용하지 않는 코드를 제거하기 위해 MS-VS2005 프로젝트에 대한 최적화 설정을 설정해야 할 사항은 다음과 같습니다 -

최적화 레벨이 -/황소

전체 프로그램 최적화를 사용 -/GL

내가 모두 찬성 시도를

이러한 옵션을 선택하면 링커가 생성 한 맵 파일을 볼 때 맵 파일에 기호 (unsed 함수) 이름이 표시됩니다.

나는 뭔가를 놓친가요? 사용하지 않는 코드를 완전히 제거하고 싶습니다.

어떻게하면됩니까?

+0

어떻게 .map 파일을 생성하고 어떤 유형의 프로젝트 (.exe? .dll? .lib?)를 컴파일하고 있습니까? –

답변

2

컴파일러는 C 파일을 한 번에 하나씩 컴파일합니다. 따라서 사용되지 않는 함수가 포함 된 C 파일을 컴파일하는 동안 컴파일러는 다른 파일에서 호출되지 않으므로 해당 함수도 컴파일합니다. 그러나 해당 함수가 정적 (파일 범위)으로 선언 된 경우 컴파일러는 해당 함수가 사용되지 않으므로 제거합니다.

전체 프로그램 최적화로도 컴파일이 라이브러리에 대한 것이므로 여전히 완료되지 않을 것이라고 생각합니다.

링커는 당신이 찾고있는 것과 비슷한 것을합니다. 코드가 여러 객체를 포함하는 라이브러리에 링크하면 코드에서 사용하는 함수가 포함되지 않은 객체 (직접 또는 간접적으로)는 최종 실행 파일에 포함되지 않습니다.

하나의 옵션은 코드를 개별 라이브러리와 개체 파일로 분리하는 것입니다.

추신 : 이것은 단지 제 추측입니다. 컴파일러 (전체 프로그램 최적화 포함) 또는 링커의 동작은 기본적으로 해당 컴파일러 또는 링커의 디자인 선택에 따라 달라집니다.

0

프로젝트 속성에는 \ Linker \ Refrences라는 플래그가 설정되어 있습니다. 설명되지 않은 함수 호출이나 사용되지 않는 데이터를 제거하기로되어있는 설명에 따라 Unreferenced Data (/ OPT : REF)를 제거하도록 설정합니다. 나는 단지 설명에 의해 갈 것이다, 나는 결코 이것을 시험해 보지 않았거나, 그것으로 일하지 않았다. 그러나 나는 방금 지난 1 시간 내에 그것을보고 우연히 시도 할 수있는 것이라고 생각했습니다.

관련 문제