Adbanced C 강의 1일차

이승현·2021년 6월 28일
0

Advanced C 강의

목록 보기
1/5

※ 강의는 가상머신 vmware를 통해 centOS로 진행됩니다.

1. 컴파일러

유닉스 환경에서 사용되는 c 컴파일러는 cc, gcc가 있다.

컴파일 과정

		전처리 해석	문법해석,이진코드로 변환	시스템 내장 라이브러리, 관련된 *obj
    원시파일(object.c) -> 전처리 후 코드 	-> 	목적파일(object.obj) -> 실행파일
    

cc ~.c -c => 컴파일 해서 .o파일로 만든다.
cc ~.c -o => 컴파일해서 실행파일 만든다.

자동링크 : 표준 라이브러리(libc.a), printf(), scanf(), strcmp() ....
수동링크 : 표준라이브러리, 수학함수(libm.a) sqrt(), -lm

2. 라이브러리

1. 정적 라이브러리

.o 파일의 집합(컴파일 과정에서 실행파일 적재)
*.a 파일로 생성된다.

ar -r ~.o => 라이브러리에 파일추가( ~.o)
-d : 삭제
cc ~.c -L. -labc (libabc.a 일경우)

(linux)라이브러리 컴파일시 옵션을 뒤에 줘야 한다.
장점 : 이식이 편하다. (따로 라이브러리 필요x)
단점 : 메모리를 공유하지 않기 때문에 메모리의 낭비가 발생한다.

2. 공유 라이브러리

gcc -c -fPIC ~.c => .o 파일 생성
gcc --shared ~.o ~.o -o lib~~.so => 공유라이브러리 생성

linux의 경우 환경변수 LD_LIBRARY_PATH를 설정해 줘야 한다.( export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~ )
시작부터 끝까지 메모리에 남아있다.

3. 동적 라이브러리

dlopen을 만날때 메모리에 업로드 된다.
dlclose 시 메모리에서 나간다.
(calc2.c -> linux의 경우 libdl.so가 필요)

3. 전처리기

  • # 으로 사용 , \로 이어서 작성가능 , ; 사용x

  • 해더 파일 중복 문제 => 중복 정의를 막기 위해 #ifndef ~ 사용
    ~~
    #endif
    (#pragma once가 더 나은것 같다.)

  • nested #include 파일은 쓰지 않는것이 좋다.

  • define 문은 ";"으로 끝나면 안된다.

4. Make

분할 컴파일

여러 파일로 나누어 작업하는 것이다.

  • 기능단위 개발 가능
  • 모듈별 테스트, 디버깅
  • 소스는 보여주지않고, 모듈만 제공가능
  • 프로그램 수정경우, 필요한 부분만 컴파일 가능
  • 모듈의 재 사용성, 프로그램 가독성을 높인다.

Make

복잡한 컴파일 작업을 자동화
make [-f makeFileName]

  • 대상 - make가 궁극적으로 생성하는것, 목적파일이나 실행파일
  • 의존성 - 대상을 생성하는 데 필요한 소스 파일의 관계
  • 명령 - 대부분 컴파일러 호출, 대상이 의존하는 파일 중 변경된 파일이 있거나 대상이 존재하지 않을 때 실행, 명령은 반드시 TAB으로 시작
  • makefile의 주석은 #

예시

calc.o : calc.c
[TAB] cc -c calc.c

※ make 파일은 첫번째 명령을 완료하면 종료된다

매크로

같은 파일이름을 여러번 써야할 떄 쓴다.( 선언 매크로명=파일이름들, 사용 : $(매크로명) OR ${매크로명} )
예시

OBJS=calc.o add.o sub.o mul.o div.o
~~
calc : $(OBJS)
~~

내부 매크로

  • $@ : 현재의 목표 파일 이름
  • $* : 확장자가 없는 현재의 목표 파일 이름
  • $? 현재 대상보다 최근에 변경된 필수 조건 파일 이름
  • $< 현재 대상보다 최근에 변경된 필수 조건 파일 이름(확장자 규칙에서만 사용)

암시적 규칙

  • .o파일을 알아서 생성해준다.
    ( 일일히 적는것 => 명시적 규칙)

접미사 규칙

  • $< 매크로를 사용한다.
  • make의 암시적 규칙을 사용하지 않고 접미사 규칙을 사용하는 이유는 컴파일시 추가적인 옵션을 설정하기 위함이다.

확장자 규칙

  • .SUFFIXES .c.o 파일간의 확장자를 자동적으로 인식해서 필요한 작업을 수행, 주의 깊게 처리할 확장자를 등록
  • 다음과 같이 수행 : .SUFFIXES:.c.o
.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 - 한 문자 변경

profile
노른노른

0개의 댓글