GCC는

2017-03-03 9 views
1
우리는 파일이 첫 번째 개체 파일로 만든 제네릭을 사용하여 소프트웨어의 조각을 컴파일하는

, 그들과 같이 내장되어 있습니다 :GCC는

다음
arm-unknown-linux-gnu-gcc -c -O2 -Wstrict-prototypes -Wdeclaration-after-statement -fsigned-char -I/opt/tm-sdk/include -mlittle-endian -Wno-trigraphs -fno-strict-aliasing -fno-omit-frame-pointer -march=armv4 -mtune=arm9tdmi -Wall -Wextra -o src/flex.o src/flex.c 
... 
arm-unknown-linux-gnu-gcc -c -O2 -Wstrict-prototypes -Wdeclaration-after-statement -fsigned-char -I/opt/tm-sdk/include -mlittle-endian -Wno-trigraphs -fno-strict-aliasing -fno-omit-frame-pointer -march=armv4 -mtune=arm9tdmi -Wall -Wextra -o src/flexdb.o src/flexdb.c 

들이 함께 연결되어 있습니다 :

arm-unknown-linux-gnu-gcc -o flex src/flex.o src/flexdb.o src/flexio.o src/flexprotocol.o src/flexsettings.o src/flexstate.o -L/opt/tm-sdk/lib -ltag -lrt -ltmreader -lsqlite3 -lsha1 

내 질문 : 연결하는 동안 최적화 및 경고 플래그를 포함해야합니까? 오브젝트 파일에서 flex 바이너리를 생성 할 때 -Wall, -Wextra 및 -O2가 포함되어 있으면 아무 일도하지 않겠습니까?

감사합니다.

편집 : 의견을 바탕으로 명확한 의미.

+0

C의 Generics는 컴파일 타임 식입니다. 그게 왜 관련성이 있는지 모르겠다. 그리고 "편집의 최종 단계"는 무엇입니까? 컴파일러는 단일 패스 (사용자보기에서)로 실행됩니다. – Olaf

+0

저는 이것을 2 단계 프로세스로보고 있습니다. 오브젝트 파일을 빌드 한 다음 오브젝트 파일을 결합하십시오. –

+0

Build! = 컴파일! – Olaf

답변

4

컴파일의 마지막 단계에서 최적화 및 경고 플래그를 포함해야합니까?

물론 링크 단계에 포함 시키려면 이 필요하지 않습니다. 당신은 이미 그것을 알고 있습니다. 왜냐하면 당신은 이 아니기 때문에을 포함하게됩니다. 하지만 당신이 정말로 알고 자하는 것이 있다고 생각합니다.

오브젝트 파일에서 flex 바이너리를 빌드 할 때 -Wall, -Wextra 및 -O2가 포함되면 아무 일도 수행 할 수 있습니까?

모든 또는 거의 모든 경고는 컴파일 단계에서 생성됩니다. 나는 손으로 예외를 알지 못하지만 어떤 것이 있다는 것은 상상할 수 있습니다. 따라서 링크 중 경고 관련 플래그를 전달하면 경고 메시지가 표시 될 수 있습니다. 하지만 컴파일 된 바이너리에는 영향을 미치지 않습니다.

최적화가 다릅니다. 링크 타임에 수행 할 수있는 최적화가 있지만 기본 최적화 레벨에서는 수행되지 않을 수 있습니다. link 명령에서 최적화 플래그를 생략해도 빌드가 손상되지 않아야합니다. 그러나이를 포함하면 더 빠르고 더 작은 바이너리가 생성 될 수 있습니다.

전반적으로 컴파일 단계에서 수행하는 링크 단계에서 동일한 경고 및 최적화 플래그가 전달되는 것을 피할 이유가 없습니다. 원하는 경우 선행 처리기 전용 플래그 (예 : -D)도 전달하는 것은 해를 끼치 지 않습니다. 연결하는 동안 무시됩니다.나는이 모든 것이 make에 의해 관리된다고 생각하기 때문에 매번 옵션을 실제로 입력 할 필요가 없습니다.

+0

정확합니다. 우리는 make를 사용하고 있습니다. 고맙습니다. –

0

아니요 gcc 및 -W에 대한 최종 호출로 링커를 호출하는 중입니다. -O 플래그는 컴파일러 용입니다.

+0

의 프론트 엔드가 될 것입니다. LTO. – Olaf

-4

-Wall은 주로 전처리 기 옵션이지만 라이브러리에 대한 참조도 있습니다. here

-Wextra는 엄격하게 C++ 전 처리기 옵션 인 것으로 보입니다. here

-O2는 컴파일러 최적화 수준 설정입니다. here

정확한 질문에 대한 답변을 얻으려면 -Wall 만 링크 단계에서 도움이 될 것입니다. 다른 두 사람은 그렇지 않습니다. 이러한 옵션의 유무에 관계없이 빌드를 작성하여 테스트 할 수 있습니다. 경고의 경우 추가 출력이 생성되는지 확인하고 코드 크기 또는 실행 시간이 빌드마다 다른지 확인하십시오.

+2

-Wall 또는 -Wextra는 선처리 프로세서 옵션이 아닙니다. – DyZ

+0

제 생각에는 --Wextra에는 C++ 전용 기능이 있습니다. 나는 그것이 C++ 일 뿐이라고 믿지 않는다. C++ 전용 옵션이 있습니다 [here] (https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html) –

+0

도움말 페이지에서 하나만 제외하면 모두 C++와 관련이 있다고합니다. 포인터는 정수 0에 대해 <, <=, > 또는> =와 비교됩니다. (C++에만 해당) 열거 자 및 비 열거자는 둘 다 조건부 표현식에 나타납니다. (C++에만 해당) 모호한 가상 기반입니다. (C++에만 해당) register로 선언 된 배열에 subscripting합니다. (C++에만 해당) register로 선언 된 변수의 주소를 가져옵니다. (C++에만 해당) 파생 클래스의 복사 생성자에서 기본 클래스가 초기화되지 않습니다. – netskink