2014-12-10 2 views
0

라이브러리 (openFrameworks)를 사용하여 프로젝트를 구축 중이며 릴리스 타겟 용 컴파일러에 설정된 기본 옵션에는 결코 사용한 적이없는 -O2 플래그가 포함되어 있습니다. 최근까지는 모든 것이 제대로 작동했기 때문에 아무 것도 생각하지 않았습니다. 그런 다음 개발에 사용되지 않는 컴퓨터에서 테스트를 시작했고 프로그램이 다운되었습니다 (디버그 문에 도달하지 못했습니다).-O2 플래그로 인해 각 시스템에서 다시 컴파일해야한다고 생각합니다. 왜?

대상 컴퓨터 자체에서 다시 컴파일하면 실행 파일이 올바르게 작동합니다. -O2 깃발이 원인일까요? 대상 컴퓨터에서 다시 컴파일 할 때 오류 또는 경고가 표시되지 않으므로이 문제가 왜 발생하는지 잘 모르겠습니다. 내가 -O2 플래그를 의심하는 이유는 프로젝트에서 사용되지 않는 유일한 플래그이기 때문입니다.

-O1 또는 -O3 플래그에서 발생하는지 여부는 아직 테스트하지 않았습니다.

저는 Windows 7입니다. 모든 테스트는 Windows 7 및 Windows 8 시스템에서 수행되었으며, Code :: Blocks에서 MinGW (TDM-GCC) 4.8.1을 사용하여 컴파일되었습니다.

+2

나는 컴파일러 플래그에 문제가 있다고 생각하지 않는다. 많은 프로젝트는 기본값으로'-O2'를 사용한다. 나는 정의되지 않은 행동에 걸 겠어. 그건 당신이 준 정보가 진짜 대답이 될 길이 없다고 말했습니다. –

+0

문제는 어디에 문제가 있을지 전혀 모르며 코드 페이지를 게시하는 것이 정확하지 않은 것입니다. 제가 할 수있는 일이 도움이 될까요? – BananasGoMoo

+0

디버거를 통해 단계별 실행. 'main()'에서 중단 점을 설정 한 다음 중단되는 것을 찾을 때까지 앞으로 나아 갑니 다. 'main()'에 도달하기 전에 충돌이 발생하면 main() 이전에 실행되는 유일한 것들이기 때문에 static (전역) 변수 초기화에 문제가있을 수 있습니다. 또는 실제로 내가 아직도 발견하지 못하는 -O2의 문제점. –

답변

-2

-O2 플래그 : -O 플래그보다 더 최적화합니다. GCC는 공간 속도를 고려하지 않은 거의 모든 최적화를 수행합니다. 컴파일러는 '-O2'를 지정할 때 루프 언 롤링 또는 함수 인라이닝을 수행하지 않습니다. '-O'와 비교할 때,이 옵션은 컴파일 시간과 생성 된 코드의 성능을 증가시킵니다.

'-O2'는 '-O'로 지정된 모든 최적화 플래그를 켭니다. 또한 다음 최적화 플래그를 설정합니다. -fforce-mem -fooptimize-sibling-calls -fstrength-reduce -fcse-follow-jump -fcse-skip-blocks -frerun -cse-after-loop -frerun-loop-opt -fgcse -fgcse-lm -fgcse-sm -fdelete-null 포인터 검사 -fexpensive-optimizations -fregmove -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fcaller-save -fpeephole2 -freorder-blocks -freorder-functions -fstrict-aliasing -falign-functions -falign-jumps -falign-loops -falign-labels

결과적으로 모든 아키텍처 또는 OS의 차이로 인해 메모리 오류 또는 잘못된 분기가 발생할 수 있습니다. 최적화 된 컴파일 된 실행 파일이나 라이브러리를 가져 가면 해당 플랫폼에서 사용할 수있는 모든 특정 하드웨어를 활용하게됩니다. 사과 하드웨어 비교와 OS가 모두 동일한 경우, 작동하는 동안 한 번 슛을 볼 수 있습니다. 그렇지만 실행 시간에 시도 할 때까지는 결정을 내리기가 어렵습니다. 문제는 컴파일러의 특성에 의존하고 일반화되지 않는다는 것입니다.

+0

C++은 보통 기본 컴퓨터 코드로 컴파일되며 다시 컴파일하지 않고 windows <-> mac과 같은 다른 OS에서 자연스럽게 작동하지 않습니다. 거기에는'-O2'에 아무것도 없어서 이식성이 떨어지는 것이 없으며 윈도우 7, 8, XP에서'-o2'와'-O3'로 컴파일 된 소프트웨어를 아무런 문제없이 자주 사용합니다. –

+0

충분히 좋습니다. 나는 "대답"이라기보다는 논평을해야했다. 이런 종류의 일관성없는 동작을 최적화하는 원인이 있지만 다른 OS 조합이라고 가정합니다. 아마도 다른 실행의 메모리 상태에 따라 따라서 초기화되지 않은 전역 일 가능성이 큽니다. – tradetree

+1

좀 더 특수화 된'-mtune = architecture'조차도 하나의 특정 아키텍처를 코딩하지만 여러 아키텍처가 여러 개의 다른 코드 경로를 사용하여 코드를 실행할 수 있도록합니다. 아키텍쳐에 종속적으로 만들 수있는 유일한 방법은'-march = architecture'입니다. 이것은 지정된 하나의 아키텍쳐에 대해서만 최적화하고 컴파일하도록합니다. –