2014-06-11 2 views
5

Microsoft cl 컴파일러를 사용하여 win32 용 ffmpeg를 컴파일 중입니다. . 나는컴파일러 최적화가없는 FFMPEG 컴파일

컴파일이 잘 간다 그래서 추가 구성 --extra-CFLAGS = -Od "어떤 최적화없이 컴파일 할 필요가 있지만, 몇 군데는 this 같은있다 :.

최근 3 IFS는

ff_sbrdsp_init_arm과 같은 호출이 컴파일러에 의해 제거되지 않기 때문에 코드가 컴파일되지만 연결되지 않습니다. 물론 최적화로 컴파일 할 때 모든 것이 괜찮 으면 컴파일러에서 모든 if (0)을 제거합니다.

ffmpeg에서 비슷한 장소 왜 전처리 기의 #if 대신에 (0)이 사용 되는가 0

뒤에 숨겨진 트릭이 있습니까?

답변

3

또는 #ifdef 솔루션에 대한 if (0) C;의 장점 중 하나는 코드가 여전히 컴파일러에 의해 유형 검사되었는지입니다. 누군가가 C 내에서 호출 된 함수 중 하나의 프로토 타입을 변경하면 컴파일을 수행하는 사람이이 구성을 사용하지 않아도 컴파일러는 callsite를 조정해야한다고 경고합니다.

이러한 죽은 전화를 제거하지 않는 컴파일 플랫폼으로 코드를 컴파일하는 실제적인 문제는 안전하게 전 처리기 버전 (*)으로 변경할 수 있습니다. 그러나 최적화없이 컴파일해야하는 이유를 설명해야합니다. 아마도 이러한 종류의 불량 코드를 제거하는 최적화 만 가능하고 가능할 수 있습니다.

(*) 여기서 특별히 #if ARCH_ARM 또는 #ifdef ARCH_ARM을 권장하기 위해 미묘하게 피해 보았습니다.하지만 이는 실마리입니다. 그것들이 다르다는 것을 명심하십시오. ARCH_ARM이 항상 0 또는 1으로 정의되는 경우 #if ARCH_ARM을 사용하십시오. 정의되어 있거나 정의되어 있지 않으면 #ifdef을 사용하십시오. 매크로가 if (…) 내부에서 작동하도록 의도 된 경우 이전 사례입니다.

+0

예, 죽은 코드는 제거하지만 다른 최적화는 수행하지 않는 최적화를 전환하는 방법 만 알고 있다면 ... BTW. 디버거에서 단계별로 디버깅해야합니다. –

+0

@Kamil_H 자동으로 대입을 처리하는 것은 어려울 수 있지만 적어도 정규 표현식'if ([A-Z _] *) '를 사용하여 모든 사이트를 찾을 수 있습니다. 수정이 필요합니다 (대문자와 밑줄만으로 구성된 모든 'if'조건을 찾습니다). –

+0

알았어, 조언 주셔서 감사하지만, 내 질문은 약간 다릅니다 :이 이유에 대한 어떤 이유가 있습니다. 그것은 누군가가 그것을 의도적으로 한 것 같습니다. –

관련 문제