소프트웨어 빌드
IDE (통합개발환경)
- Build기능을 겸하기도 하지만 주로 코드 개발(코드 작성, 컴파일, 링크, 디버깅 등)에 초점
- 리눅스용 C/C++ IDE
- ex. KDevelop, Eclipse, NetBeans, CodeBlocks, Anjuta
gcc & g++
- GNU Compiler Collection & GNU C Compiler
- GCC는 .c랑 .cpp 확장자의 소스 파일을 각각 C와 C++언어로 컴파일 한 후 C라이브러리와 링크
- g++은 GNU C++ Compiler
- g++은 모두 C++ 언어로 컴파일하고 C++ 라이브러리와 링크
gcc 명령
형식
gcc 옵션
소스파일 리스트
옵션
-c
: 컴파일만 수행 (링크 X)
-o <file>
: 실행 결과를 file 이름으로 저장
-g
: 디버깅용 코드 생성
-O
: 코드 최적화 수준 지정
-I
: 표준 헤더파일 이외에 헤더파일들이 있는 디렉토리들을 지정
-L
: 링크할 라이브러리를 지정
-Wall
: 더욱 많은 경고 메시지 출력
라이브러리 사용하기
소스 코드에 사용할 라이브러리 헤더 파일 include
#include <foo.h>
#include <foo/foo.h>
각 라이브러리에 대한 문서 참조
라이브러리를 사용하는 프로그램의 컴파일
- 컴파일 시 헤더 파일과 라이브러리 위치를 제공해야함
- 가장 쉬운 방법은 pkg-config를 사용하는 것(대부분의 라이브러리들이 지원)
gcc -o test test.c $(pkg-config --cflags -libs)
디폴트로 라이브러리와 동적으로 링크
디버깅
GNU 개발의 공식 디버거는 gdb
컴파일 할 때 -g 옵션 추가하고 gdb 디버거 실행
gcc -o test test.c -g //컴파일 할 때 -g 옵션 추가
gdb test //gdb 디버거 실행
gdb?
- 텍스트 기반
- 쉘과 유사한 커맨드라인 인터페이스 제공
명령어
break (b)
: 브레이크 포인트 설정, 함수명이나 코드 위치, 메모리 절대 주소 등
print (p)
: 변수의 값을 프린트
c
: 다음 브레이크 포인트까지 실행
next (n)
: 한줄 실행
step (s)
: 한줄 실행
backtrace (bt)
: 함수 호출 스택 디스플레이
run / start
: 프로그램 실행, start는 디버깅 실행
'#include' 지시어는 여러 개의 소스파일들이 정보를 공유할 수 있게 해줌
- #include 지시어는 전처리기로 하여금 지정된 파일을 삽입하도록 함.
- 따라서 여러 소스 파일이 공유해야 하는 정보를 헤더 파일에 저장하고, include 지시어를 이용해 그 내용이 소스 파일에 포함되도록 만듦.
- 이런 식으로 다른 파일에 소스 코드가 삽입되는 파일을 header 파일 혹은 include 파일이라고 부르며, 전통적으로 header 파일은 확장자
.h
를 가진다
#include 지시어
형태
#include <filename>
전처리기는 시스템 header파일 디렉토리를 검사
#include "filename"
현재 디렉토리를 먼저 검사하고, 시스템 header파일 디렉토리를 검사
- 중복된 헤더파일이 항상 오류인 것은 아님
- 매크로 정의, 함수 프로토타입, 그리고 외부 변수의 선언은 여러번 중복되어도 상관 없음
- 하지만 타입 정의가 중복되는 것은 컴파일러 오류를 야기함
헤더 파일 중복 방지
전통적인 방법
- 중복된 헤더 파일 문제를 해결하기 위해 #ifndef - #endif 지시어 사용
pragma 지시어 사용
make와 Makefile
Makefile
- 파일들간의 의존성(프로그램 빌드에는 순서 有)을 기술하는 파일
- 프로그램을 빌드하는 방법 정의
유틸리티 프로그램 make
- Makefile을 읽어서 지정된 방법으로 프로그램을 빌드해주는 프로그램
프로그램 소스 파일에서 각종 심볼(변수, 함수, 매크로 등)들에 대한 Tag File(인덱스/데이터베이스)를 구성하여 심볼들을 정의한 위치와 참조관계를 빠르게 탐색할 수 있는 소프트웨어
사용법
- vi ~/.vimrc 명령으로 vimrc파일을 열고 다음(2)과 같이 설정
- set tags=./tags
- vi 명령으로 소스 파일을 읽고 ctags 명령 사용