2014년 12월 12일 금요일

Linux gcc 옵션

-g 옵션
소스레벨에서 디버그를 한다면..
소스코드 - 기계어 간의 매칭 되는 정보가 있어야 함으로
gcc -g 옵션하면 out파일의 크기는 커진다.

-o(소문자o) 옵션
out 파일의 경로를 지정

-O (대문자 O) 옵션
gcc hello.c   -> gcc hello.c -O0
gcc hello.c -O1 -> gcc hello.c -O   1단계 최적화, 레벨별 성능향상의 비율이 가장큼
-O2
-O3
-Os  : size 최적화. 다른것은 속도..소형 Embeded라면.. 필요할 수 있음..
개발 단계에서는 최적화 하지 않고 디버깅을 위해 -g옵션을
어떤 옵션을 써야 할까.. 리눅스 운영체제의 컴파일 옵션을 본다면.. O2, 사이즈가 중요하다면 Os

-std 옵션
내가 작성한 소스코드가 표준을 따르고 있는지 워닝을 보기 원한다면
gcc -std=c90(ansi표준) 처럼 입력함.
지금의 gcc는 표준에 일치하지 않더라도 워닝을 띄우지 않음으로
필요하다면 - pedantic 옵션과 같이 사용
pedantic의 의미는 "지나치게 룰을 따지는?"정도..
-std=c90은 -ansi 와 동일함.
내 코드가 ansi 표준에 맞게 작성했는지 확인해야한다면
gcc -ansi -pedantic 옵션을 추가하면된다.

-W 옵션 워닝을 보여줌
-Wall 모든 경고를 보여줌.(내가 작성한 것중에서)

-D 옵션 컴파일시 define함..#define
gcc 옵션으로 -D를 한다는것은 소스코드 레벨에서 맨 위쪽에서 define하는것과 같음.

-m 옵션
cpu마다 달라지는 옵션, Embeded 프로그램 해야할때 자주 사용
x86
ARM
MIPS
PowerPC
gcc는 여러 종류의 cpu를 지원하지만..기본 상태에서는 하나의 cpu만 지원..
우분투에서는 x86 cpu만 되지만..
gcc를 ARM용을 받아다가 gcc > cpu이름 -gcc 로 재컴파일 하게 되면
ARM용 gcc를 만들어서 쓸수 있음..Cross Compiler
현재 하드웨어에 맞게 어셈코드를 생성해야함.
arm 아키텍쳐
ARMv4
ARMv5
ARMv6
ARMv7 (요즘 많이 쓰이는 핸드폰)
ARMv8
-march=armv4t 처럼 아키텍쳐를 지정하거나
또는 cpu를 안다면 cpu를 직접 지정 -mcpu=arm920t
적용할 보드가 big-endian을 쓴다면 -mbig-endian 옵션으로 수정해주어야함.


./ 상대경로 현재 경로
../ 상대경로 현재의 상위 경로
gcc -c *.c -I ../include/
-I 옵션 인클루드파일을 이 경로에서도 찾으라는 명령


라이브러리 사용
gcc ... -l 라이브러리명
gcc ... -l 라이브러리파일명
ex) gcc -lm libm.so 또는 libm.a 둘중 하나를 찾아서 링크
둘다 있을 경우 공유 라이브러리가 우선
정적 라이브러리를 쓰고 싶을 경우 -static 옵션을 씀.
Embeded 시스템에서는 왠만하면 동적으로.


gcc -Wa,옵션1,옵션2,..... 어셈블러에게 전달  -Wl,옵션1,..링커에게 전달..
전처리기 : gcc에 완벽하게 포함
컴파일러 : gcc에 완벽하게 포함
어셈블러 : 아래 두개는 gcc에 완벽히 포함되지 않음. 어셈블러,링커 매뉴얼을 확인해야함.gcc에 없음.
링커


gcc에서 옵션순서 상관..
-다른것은 괜찬으나 library 관련 -l 옵션은 순서 상관있음.뒤에 넣어야함.


gcc -M *.c
-M 옵션 헤더파일의 의존성 표준헤더까지 싹
-MM 옵션 개발자가 만든것만


gcc -pg -g pgtest2.c
-pg 옵션 : 실행시 프로그램 정보확인 옵션

※참고 : gprof -A a.out > data.txt
-pg 옵션으로 생성된 파일을 분석하는 tool
 --> arm보드환경에서는 arm용 gprof를 따로 사용

※참고 : 컴파일 할때는 컴파일만, 컴파일 후 링크하는게 좋다.
프로젝트가 커지면 컴파일시간이 오래 걸림..

댓글 없음:

댓글 쓰기