※ 강의는 가상머신 vmware를 통해 centOS로 진행됩니다.
유닉스 환경에서 사용되는 c 컴파일러는 cc, gcc가 있다.
전처리 해석 문법해석,이진코드로 변환 시스템 내장 라이브러리, 관련된 *obj
원시파일(object.c) -> 전처리 후 코드 -> 목적파일(object.obj) -> 실행파일
cc ~.c -c => 컴파일 해서 .o파일로 만든다.
cc ~.c -o => 컴파일해서 실행파일 만든다.
자동링크 : 표준 라이브러리(libc.a), printf(), scanf(), strcmp() ....
수동링크 : 표준라이브러리, 수학함수(libm.a) sqrt(), -lm
.o 파일의 집합(컴파일 과정에서 실행파일 적재)
*.a 파일로 생성된다.
ar -r ~.o => 라이브러리에 파일추가( ~.o)
-d : 삭제
cc ~.c -L. -labc (libabc.a 일경우)
(linux)라이브러리 컴파일시 옵션을 뒤에 줘야 한다.
장점 : 이식이 편하다. (따로 라이브러리 필요x)
단점 : 메모리를 공유하지 않기 때문에 메모리의 낭비가 발생한다.
gcc -c -fPIC ~.c => .o 파일 생성
gcc --shared ~.o ~.o -o lib~~.so => 공유라이브러리 생성
linux의 경우 환경변수 LD_LIBRARY_PATH를 설정해 줘야 한다.( export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~ )
시작부터 끝까지 메모리에 남아있다.
dlopen을 만날때 메모리에 업로드 된다.
dlclose 시 메모리에서 나간다.
(calc2.c -> linux의 경우 libdl.so가 필요)
# 으로 사용 , \로 이어서 작성가능 , ; 사용x
해더 파일 중복 문제 => 중복 정의를 막기 위해 #ifndef ~ 사용
~~
#endif
(#pragma once가 더 나은것 같다.)
nested #include 파일은 쓰지 않는것이 좋다.
define 문은 ";"으로 끝나면 안된다.
여러 파일로 나누어 작업하는 것이다.
복잡한 컴파일 작업을 자동화
make [-f makeFileName]
예시
calc.o : calc.c
[TAB] cc -c calc.c
※ make 파일은 첫번째 명령을 완료하면 종료된다
같은 파일이름을 여러번 써야할 떄 쓴다.( 선언 매크로명=파일이름들, 사용 : $(매크로명) OR ${매크로명} )
예시
OBJS=calc.o add.o sub.o mul.o div.o
~~
calc : $(OBJS)
~~
.c.o : $(CC) $(CFLAGS) -c $< -o $@
참고 - vi 명령어
dw - 단어삭제
[n]dd - [n]줄삭제(미입력시 1)
u - 명령취소
[n]yy - [n]줄 버퍼복사
p - 붙여넣기
hjkl - 방향키
0 - 줄 처음 (영) ,(-문장,[-문단
$ - 줄 끝 , )-문장,]-문단
[n]- - [n]줄만큼 윗줄로
[n]+ - [n]줄만큼 아래로
G - 파일 끝으로 이동
[n]G - [n]줄로 이동
r - 한 문자 변경