gcc 컴 파일 옵션
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
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
#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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio에서 파일 폴더 구분 (포함 경로 설정)Visual Studio에서 c, cpp, h, hpp 파일을 폴더로 나누고 싶었습니까? 어쩌면 대부분의 사람들이 있다고 생각합니다. 처음에 파일이 만들어지는 장소는 프로젝트 파일 등과 같은 장소에 있기 때문에 파일...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.