gcc 컴 파일 옵션

8954 단어 C++clinuxgccC#
위 에서 위로 박문:http://apps.hi.baidu.com/share/detail/14973380
 
GNU 컴 파 일 러 집합 (그 전신 은 GNU C 컴 파 일 러) 은 1987 년 탄생 했다.당시 Richard Stallman (GNU 프로젝트 의 창시자) 은 그 가 정의 한 '자유 소프트웨어' 개념 을 만족 시 키 고 GNU 프로젝트 가 발표 한 다른 소프트웨어 를 컴 파일 할 수 있 는 컴 파일 러 를 만 들 려 고 했다.GNU C 컴 파 일 러 는 자유 소프트웨어 커 뮤 니 티 에서 빠르게 유행 하고 있 으 며 건장 성과 이식 성 으로 유명 하 다.그것 은 이미 많은 통합 개발 도구 의 기초 가 되 어 세계 각지 의 발행 업 체 에 의 해 Linux 와 다른 운영 체제 에 응용 되 었 다.
 
GCC 는 더 이상 GNU 프로젝트 자체 의 소프트웨어 를 대상 으로 하 는 소형 C 언어 컴 파일 러 가 아니다.C, C + +, Ada, Fortran, Objective C, 심지어 자바 까지 다양한 언어 를 지원 하고 있 습 니 다.사실 현대 리 눅 스 시스템 은 GNU 도구 가 직접 지원 하 는 언어 를 자 랑스 럽 게 자랑 할 수 있 을 뿐만 아니 라 많은 다른 언어 도 지원 한다.날로 유행 하 는 스 크 립 트 언어 Perl, Python, Ruby, 그리고 계속 발전 하고 있 는 mono 이식 가능 C \ # 실현 은 사람들 이 Linux 프로 그래 밍 에 대한 전통 적 인 견 해 를 약화 시 키 는 데 도움 이 되 지만 이것 은 완전히 다른 문제 이다.
Linux 커 널 과 많은 자유 소프트웨어, 오픈 소스 프로그램 은 모두 C 언어 로 작성 되 고 GCC 로 컴 파일 되 었 습 니 다.
1. 단일 원본 파일 컴 파일
테스트 를 진행 하기 위해 서 "Hello World" 프로그램 을 만 들 수 있 습 니 다.
#include #include
int main(int argc, char **argv) { printf(”Hello world!”); exit(0); }
다음 명령 을 사용 하여 이 코드 를 컴 파일 하고 테스트 합 니 다. # gcc -o hello hello.c
# ./hello
Hello wordl!
기본 적 인 상황 에서 실행 가능 한 프로그램 이름 은 a. out 이지 만 gcc 의 "- o" 옵션 을 통 해 실행 가능 한 프로그램 이름 을 지정 할 수 있 습 니 다.
2. 여러 원본 파일 컴 파일
원본 파일 message. c 는 간단 한 메시지 인쇄 함 수 를 포함 합 니 다:
#include
void goodbye_world(void) { printf(”Goodbye, world!”); }
gcc 의 "- c" 표 시 를 사용 하여 지원 라 이브 러 리 코드 를 컴 파일 합 니 다: # gcc -c message.c 이 과정의 출력 결 과 는 message. o 라 는 파일 로 큰 프로그램 에 연결 할 수 있 는 컴 파일 된 대상 코드 를 포함 합 니 다.
goodby 호출 을 포함 하 는 간단 한 예제 프로그램 을 만 듭 니 다.World 의 main 함수
#include
void goodbye_world(void):
int main(int argc, char **argv) { goodbye_world(); exit(0); }
GCC 를 사용 하여 이 프로그램 을 컴 파일 합 니 다: # gcc -c main.c 현재 두 개의 대상 파일 이 있 습 니 다: message. o 와 main. o.그것들 은 리 눅 스에 서 실 행 될 수 있 는 목표 코드 를 포함한다.이 대상 코드 에서 Linux 실행 가능 한 프로그램 을 만 들 려 면 연결 단계 의 작업 을 수행 하기 위해 GCC 를 다시 호출 해 야 합 니 다: \ # gcc - o goodbye message. o main. o
컴 파일 결과 실행: # ./goodbye
Goodbye, world!
앞의 이 단독 절 차 는 하나의 명령 으로 간략화 할 수 있 습 니 다. 이것 은 GCC 가 여러 소스 파일 을 실행 가능 한 프로그램 으로 컴 파일 하 는 방법 에 대해 내 장 된 규칙 이 있 기 때 문 입 니 다.# gcc -o goodbye message.c main.c
# ./goodbye
Goodbye, world!

3. 외부 함수 라 이브 러 리 사용
GCC 는 표준 루틴 을 포함 하 는 외부 소프트웨어 라 이브 러 리 와 결합 하여 자주 사용 되 며, 거의 모든 Linux 응용 프로그램 은 GNU C 함수 라 이브 러 리 GLIBC 에 의존 합 니 다.외부 함수 라 이브 러 리 의 예 적용:
#include #include #include
#define MAX_INPUT 25
int main(int agrc, char **argv) { char input[MAX_INPUT]; double angle;
printf(”Give me an angle (in radians) ==>”); if(!fgets(input, MAX_INPUT, stdin)){ perror(”an error occurred.”); } angle = strtod(input, NULL);
printf(”sin(%e) = %e”, angle, sin(angle));
return 0; }
컴 파일 명령: # gcc -o trig -lm trig.c GCC 의 "- lm" 옵션 은 GCC 에 시스템 이 제공 하 는 수학 라 이브 러 리 (libm) 를 보 여 줍 니 다.Linux 와 UNIX 의 시스템 함수 라 이브 러 리 는 보통 "lib" 를 접두사 로 하기 때문에 존재 한다 고 가정 합 니 다.실제 함수 라 이브 러 리 의 위 치 는 시스템 에 따라 다 르 지만 디 렉 터 리 / lib 또는 / usr / lib 에 있 습 니 다. 이 디 렉 터 리 에는 수백 개의 다른 필요 한 시스템 함수 라 이브 러 리 가 있 습 니 다.
4. 공유 함수 라 이브 러 리 와 정적 함수 라 이브 러 리
Linux 시스템 의 함수 라 이브 러 리 는 두 가지 서로 다른 유형 으로 나 뉜 다. 공유 하 는 것 과 정적 인 것 이다.
정적 함수 라 이브 러 리: 프로그램 이 정적 으로 연 결 된 함수 라 이브 러 리 와 함께 컴 파일 될 때마다 인 용 된 라 이브 러 리 함수 의 코드 는 최종 바 이 너 리 프로그램 에 직접 포 함 됩 니 다.
공유 함수 라 이브 러 리: 모든 라 이브 러 리 함수 의 단일 전역 버 전 을 포함 하여 모든 프로그램 에서 공유 합 니 다.이 과정 뒤에 관련 된 메커니즘 은 상당히 복잡 하지만 주로 현대 컴퓨터 의 가상 메모리 능력 에 의존 하여 라 이브 러 리 함 수 를 포함 한 물리 적 메모리 가 여러 독립 된 사용자 프로그램 간 에 안전하게 공유 할 수 있 도록 한다.
공유 함수 라 이브 러 리 를 사용 하면 파일 의 용량 과 Linux 응용 프로그램 이 메모리 에 덮어 쓰 는 영역 을 줄 일 뿐만 아니 라 시스템 의 안전성 도 향상 시 킬 수 있다.여러 프로그램 에서 동시에 호출 되 는 공유 함수 라 이브 러 리 는 디스크 의 교환 파 티 션 이 아 닌 메모리 에 남아 있 을 수 있 습 니 다.이것 은 일부 대형 리 눅 스 응용 프로그램의 적재 시간 을 더욱 줄 이 는 데 도움 이 된다.
위의 message. c 를 공유 라 이브 러 리 함수 로 사용 하 는 예:# gcc -fPIC -c message.c "PIC" 명령 행 표 시 는 GCC 에서 발생 하 는 코드 에 함수 와 변수의 구체 적 인 메모리 위치 에 대한 인용 을 포함 하지 말 라 고 알려 줍 니 다. 이 는 이 메시지 코드 를 사용 하 는 프로그램 이 메모리 주소 공간 에 연결 할 지 아직 알 수 없 기 때 문 입 니 다.이렇게 출력 된 파일 message. o 를 컴 파일 하면 공유 함수 라 이브 러 리 를 만 드 는 데 사용 할 수 있 습 니 다. gcc 의 "- shared" 태그 만 사용 하면 됩 니 다. # gcc -shared -o libmessage.so message.o 위의 mian. c 를 공유 라 이브 러 리 함수 ligmessage. so 컴 파일: # gcc -o goodbye -lmessage -L. message.o "- lmessage" 표 시 를 사용 하여 GCC 가 연결 단계 에서 공유 함수 라 이브 러 리 libmessage. so 를 참조 하 는 것 을 알려 줍 니 다."- L." 표 시 는 GCC 함수 라 이브 러 리 가 현재 디 렉 터 리 에 있 을 수 있 음 을 알려 줍 니 다. 그렇지 않 으 면 GNU 커 넥 터 가 표준 시스템 함수 라 이브 러 리 디 렉 터 리 를 찾 습 니 다. 이 경우 사용 가능 한 함수 라 이브 러 리 를 찾 을 수 없습니다.
컴 파일 된 goodbye 를 실행 하면 공유 함수 라 이브 러 리 를 찾 을 수 없습니다. #./goodbye
./goodbye: error while loading shared libraries: libmessage.so: cannot open shared object file: No such file or directory
특정 프로그램 이 사용 해 야 할 함수 라 이브 러 리 를 명령 ldd 로 발견 할 수 있 습 니 다.ldd 검색 표준 시스템 함수 라 이브 러 리 경 로 를 표시 하고 특정 프로그램 이 사용 하 는 함수 라 이브 러 리 버 전 을 표시 합 니 다.
#ldd goodbye linux-gate.so.1 => (0×00493000) libmessage.so => not found libc.so.6 => /lib/libc.so.6 (0×0097c000) /lib/ld-linux.so.2 (0×0095a000)
라 이브 러 리 파일 libmessage. so 는 표준 검색 경로 에서 찾 을 수 없 으 며, 시스템 이 제공 하 는 프로필 / etc / ld. so. conf 에 도 이 라 이브 러 리 파일 을 포함 하 는 디 렉 터 리 를 지정 하 는 추가 항목 이 포함 되 어 있 지 않 습 니 다.
환경 변수 LD 를 설정 해 야 합 니 다.LIBRARY_PATH 는 추가 공유 함수 라 이브 러 리 검색 경 로 를 만 듭 니 다. # export LD_LIBRARY_PATH=`pwd`
# ldd goodbye
linux-gate.so.1 => (0x002ce000)
libmessage.so => /tmp/cpro/libmessage.so (0x00b0f000)
libc.so.6 => /lib/libc.so.6 (0x0097c000)
/lib/ld-linux.so.2 (0x0095a000)
프로그램 실행 # ./goodbye
Goodbye, world!
gcc 명령 행 에서 자주 사용 하 는 몇 가지 옵션 은: c 입 니 다.   사전 처리, 컴 파일, 어 셈 블 리 소스 프로그램 만 연결 하지 않 습 니 다.컴 파일 러 는 모든 원본 프로그램 에 대상 파일 을 만 듭 니 다. -o file 출력 파일 을 file 로 확인 합 니 다.- o 옵션 을 사용 하지 않 으 면 실행 가능 한 파일 의 출력 은 a. out 이 고 대상 파일 과 어 셈 블 리 파일 의 출력 은 source. suffix 에 각각 source. o 와 source. s 이 며, 미리 처 리 된 C 소스 프로그램의 출력 은 표준 출력 stdout 입 니 다. -Dmacro 또는 - Dmacro = defn   그 역할 은 원본 프로그램의 \ # define 과 유사 합 니 다.예:% gcc - c - DAVEGDBM -DHELP_FILE = \ "help \" cdict. c 중 첫 번 째 - D 옵션 정의 매크로 HAVEGDBM, 프로그램 에서 \ # ifdef 로 설정 되 어 있 는 지 확인 할 수 있 습 니 다.두 번 째 - D 옵션 은 매크로 HELPFILE 는 문자열 "help" 로 정의 합 니 다. (역 사선 의 역할 로 인해 따옴표 가 실제 적 으로 이 매크로 정의 의 일부분 이 되 었 습 니 다) 이것 은 제어 프로그램 에서 어떤 파일 을 열 수 있 는 지 에 유용 합 니 다. -Umacro   일부 매크로 는 컴 파일 러 에 의 해 자동 으로 정의 된다.이 매크로 들 은 보통 컴 파일 된 컴퓨터 시스템 형식의 기 호 를 지정 할 수 있 습 니 다. 사용 자 는 특정한 프로그램 을 컴 파일 할 때 - v 옵션 을 추가 하여 gcc 가 부족 하여 어떤 매크로 를 정의 하 는 지 볼 수 있 습 니 다.사용자 가 매크로 정 의 를 취소 하려 면 - Umacro 옵션 을 사용 하 십시오. 이것 은 \ # undef macro 를 컴 파일 할 원본 파일 의 시작 에 두 는 것 과 같 습 니 다. -Idir   검색 헤더 파일 의 디 렉 터 리 목록 에 dir 디 렉 터 리 를 추가 하고 gcc 에 부족 한 검색 디 렉 터 리 보다 우선 합 니 다.여러 개의 - I 옵션 이 있 는 경우 명령 행 에서 - I 옵션 의 앞 뒤 순서에 따라 검색 합 니 다.dir 는 I.. / inc 등 상대 경 로 를 사용 할 수 있 습 니 다. -O   프로그램 컴 파일 을 최적화 시 키 고 컴 파일 러 는 컴 파일 된 프로그램의 길이 와 실행 시간 을 줄 이려 고 하지만 컴 파일 속 도 는 최적화 하지 않 는 것 보다 느 리 고 많은 메모 리 를 요구 합 니 다. -O2   - O 보다 더 좋 은 최 적 화 를 허용 하고 컴 파일 속도 가 느 리 지만 결과 프로그램의 실행 속도 가 빠 릅 니 다. -g   디 버 깅 과 디 버 깅 에 사용 할 확장 기호 표를 만 듭 니 다. -g 옵션 을 사용 하면 프로그램 이 GNU 디 버 깅 프로그램 GDB 로 디 버 깅 할 수 있 습 니 다.최적화 와 디 버 깅 은 일반적으로 호 환 되 지 않 으 며, 동시에 - g 와 - O (- O2) 옵션 을 사용 하면 프로그램 이 이상 한 실행 결 과 를 만 들 수 있 습 니 다.그 러 니까 - g 와 - O (- O2) 옵션 을 동시에 사용 하지 마 세 요. -fpic 또는 - fpic   위치 와 무관 한 목표 코드 를 만들어 공유 함수 라 이브 러 리 를 만 드 는 데 사용 할 수 있 습 니 다.이상 은 gcc 의 컴 파일 옵션 입 니 다.gcc 명령 줄 에 연결 옵션 도 사용 할 수 있 습 니 다.사실 gcc 는 식별 할 수 없 는 모든 옵션 을 연결 프로그램 ld 에 전달 합 니 다.연결 프로그램 ld 는 몇 개의 대상 파일 과 라 이브 러 리 프로그램 을 실행 가능 한 파일 로 조합 하여 외부 변수, 외부 과정, 라 이브 러 리 프로그램 등에 대한 인용 을 해결 해 야 합 니 다.그러나 우 리 는 영원히 명시 적 으로 ld 를 호출 할 필요 가 없다.gcc 명령 을 이용 하여 각 파일 을 연결 하 는 것 은 간단 합 니 다. 명령 줄 에 라 이브 러 리 프로그램 이 표시 되 어 있 지 않 더 라 도 gcc 는 일부 라 이브 러 리 프로그램 이 정확 한 순서 로 나타 날 수 있 도록 보장 합 니 다.gcc 의 일반적인 연결 옵션 은 다음 과 같은 몇 가지 가 있 습 니 다. - Ldir   dir 디 렉 터 리 를 검색 - l 옵션 이 지정 한 함수 라 이브 러 리 파일 의 디 렉 터 리 목록 에 추가 하고 gcc 가 부족 한 검색 디 렉 터 리 보다 우선 합 니 다.여러 개의 - L 옵션 이 있 는 경우 명령 행 에서 - L 옵션 의 앞 뒤 순서에 따라 검색 합 니 다.dir 는 상대 경 로 를 사용 할 수 있 습 니 다.예 를 들 어 - L.. / lib 등. -lname   연결 할 때 함수 라 이브 러 리 libname. a 를 사용 합 니 다. 연결 프로그램 은 - Idir 옵션 이 지정 한 디 렉 터 리 와 / lib, / usr / lib 디 렉 터 리 에서 이 라 이브 러 리 파일 을 찾 습 니 다.- static 옵션 을 사용 하지 않 았 을 때 공유 함수 라 이브 러 리 libname. so 를 발견 하면 libname. so 를 사용 하여 동적 연결 을 합 니 다. -static   공유 함수 라 이브 러 리 와 연결 금지 -shared   가능 한 한 공유 함수 라 이브 러 리 와 연결 하 세 요.이것 은 Linux 에서 연결 프로그램의 부족 한 옵션 입 니 다.다음은 gcc 로 연결 하 는 예 입 니 다. % gcc -o prog main.o subr.o -L../lib -lany -lm  

좋은 웹페이지 즐겨찾기