make 명령어

  1. 규모가 큰 프로그램의 컴파일을 위한 유용한 도구

  2. 많은 수의 소스로 구성된 프로그램

  3. 사용자와 시스템에 따라 다양한 컴파일 옵션이 필요한 프로그램

  4. 시스템 설정 구성 - 컴파일 - 설치 등의 일련의 작업이 필요한 경우

  5. make 명령어는 makefile을 이용하여 컴파일 작업을 수행한다.

make [-f makefile이름] [options] [targets]


- 별도의 makefile 파일을 지정하지 않으면 현재 디렉터리의 makefile 혹은 Makefile을 이용한다.

- 타겟을 지정하지 않으면 all 타겟을 빌드한다.



Makefile

  1. 컴파일/빌드 규칙을 기술해 놓은 파일

  2. 컴파일 명령을 비롯한 쉘 명령어로 구성 (쉘 스크립트와 유사하다)

  3. 소스파일들 간의 종속성을 명시

  4. make가 종속성을 자동적으로 파악하여 효율적인 컴파일 작업 수행

  5. 소스파일 하나를 수정하더라도 전부 컴파일할 필요가 없다.

  6. 소스 컴파일 이외의 작업도 기술 가능



Makefile의 기본 구성

1. 타겟(Target)

  • 종속성을 표시하기위해 쉘 명령어를 그룹핑한 것 (종속성 목록은 파일이름들이 나열되어 있다.)

  • 콜론(:)으로 타겟과 종속성 목록을 구분한다. ex) target : test1.o test2.o

  • 쉘 명령어는 항상 [tab] 으로 시작하며, 타겟 다음줄부터 기술한다.

  • 그 타겟의 종속성이 맞을 때만 쉘 명령어가 실행된다. 즉, 파일들이 그 타겟을 구성한다고 생각하면 된다.

  • 종속성 목록에 있는 파일들을 만들기 위해 make 명령어로 컴파일 작업을 수행한다.

  • 종속성 목록 중 하나라도 빠지면 오류 발생


2. 과정(Procedure)

  • 명령행에 지정된 명령을 실행하여 타겟을 빌드

  • 종속성에 지정된 파일이 없으면 해당 빌드 수행

  • 종속성 파일이 갱신되면 타겟을 다시 빌드

  • all과 clean

- all: 모든 빌드 타겟을 종속성 목록에 명시

- clean: make에 의해 생성된 파일들을 삭제


3. 매크로(Macro)

  • 매크로(=변수) 정의 : 매크로 이름 = 값

  • 매크로 사용 : $(매크로이름), ${매크로이름}

  • 주석은 '#'으로 시작한다.

  • 매크로는 항상 맨 위에 기술한다.

  • 기본적인 매크로

- CC : 컴파일러 프로그램 명시

- CFLAGS : 컴파일 옵션 명시



'Note' 카테고리의 다른 글

[GooglePlay] 인앱 결제  (0) 2018.12.29
GDB 사용법  (0) 2018.06.29
GCC 사용법  (0) 2018.06.29
git 명령어 & Bitbucket 사용하기  (0) 2018.06.27
Domain Name System - DNS와 네임서버  (0) 2017.06.20


GCC = GNU C Compiler



1. 주요 옵션

 -g

 디버깅 정보를 포함하여 출력 파일 생성

 -W

 합법적이지만 모호한 코딩에 대해 경고 메시지 출력

 -Wall

 모든 모호한 코딩에 대해 경고 메시지 출력

 -O2

 최적화 수준2 (-O0, -O1, -O3 가능)

 -o  [파일이름]

 출력 실행파일 이름 지정 (옵션이 없으면 a.out으로 생성)


2. 출력 제어 옵션

 -E

 전처리 결과를 화면에 출력

 -S

 컴파일만 수행, *.s 파일 생성

 -c

 컴파일과 어셈블만 수행, *.o 파일 생성

 -v

 컴파일 과정과 각 명령어와 gcc 버전 정보 표시

 -save-temps

 컴파일 중간 파일 생성 (*.i, *.s)



3. 전처리 옵션

-D<Macro>[=value]

 상수 선언(#define), 선택적 컴파일이나 외부 상수 선언에 사용

 -I<dir>

헤더 파일의 검색 경로 추가


4. 최적화 옵션

 -O<숫자>

 숫자가 클수록 최적화 수준 높음

 프로그램의 실행 시간과 크기를 줄이는 최적화

 컴파일 시간이 증가하고, 안전성에 문제 가능성 있음.

 -Os

 프로그램 크기를 줄이는 최적화

 -march=<CPU>

 특정 CPU에 최적화된 코드 생성



5. 링킹 옵션

 -l<library>

 링킹 라이브러리 지정

 -L<dir>

 라이브러리 검색 경로 추가

 -static

 정적 라이브러리로 링킹 수행

 디버깅 시 라이브러리 함수 디스어셈 가능



6. 기타 옵션

-m32

 i386의 32비트 아키텍처로 컴파일

 -M, -MM

소스 파일 종속성 정보 표시 (makefile에 사용)

  -z execstack

 스택에 실행권한을 설정 ( DEP 해제 )


예시)

gcc -g -W Wall -O2 -o output file1.c file2.c

file1.c, file2.c 를 컴파일하고 링크하여 출력

실행파일 output 생성

소스 파일 중에 반드시 하나의 main() 함수가 있어야 한다.

'Note' 카테고리의 다른 글

GDB 사용법  (0) 2018.06.29
make 사용법 (+Makefile)  (0) 2018.06.29
git 명령어 & Bitbucket 사용하기  (0) 2018.06.27
Domain Name System - DNS와 네임서버  (0) 2017.06.20
운영체제별 개행문자(줄바꿈문자)  (0) 2017.06.20


Git 명령어



1. 상태확인


git log
- HEAD : 현재 사용중인 브랜치, HEAD를 이동시켜 commit 선택 가능


어떻게 이동시키는가?

HEAD~N : N세대 앞의 커밋            ex) git log HEAD~1
HEAD^N : N번째 원본인지 지정    ex) git log HEAD^1


git log -p -n
 : 최신순으로 n개의 커밋보기



git log --stat

 : 수정 전 또는 삭제된 코드 보기



git status

 : untracked file 확인 가능. 즉, stage에 올라가지 않은 file 확인 가능 (add 명령 전)



2. branch

로컬 저장소용 브랜치 : master
원격 저장소용 브랜치 : origin
리모트 브랜치 : origin/master 또는 [원격저장소용 브랜치/로컬저장소용 브랜치]

* 각 commit은 현재 branch 에서 추가된다.

git branch [브랜치명]

  : 브랜치 생성



git branch --merged

 : 합친 브랜치 보기 (*는 현재 브랜치)


* 현재 A브랜치에 있을 때, B브랜치를 생성하면 나중에 B브랜치를 A브랜치에 합병할 수 있다.

이 때, B브랜치에 HEAD가 있을 것이다.


<브랜치 합병하기>

git checkout branchA

git merge branchB


이미 분기전 브랜치면 checkout은 할필요 x
부모 브랜치 상태에서 자식 브랜치들을 합병 (모든 커밋이 적용됨)



git branch --no-merged

 : 안합친 브랜치 보기

 

 
git checkout [브랜치명]

 : 브랜치 바꾸기

 
 
3. 원격저장소에 파일 올리기


<아래의 순서 유지>


git pull

 : 반드시 원격 저장소 내용을 로컬 저장소에 동기화 시킬 것. (동기화 안되어 있을 경우 push 할 때 거절됨)



git add [FilePath]
 : stage에 올리기. 다올리려면 --all 옵션 추가



git commit -m "message"
 : 변경사항을 인덱스(INDEX)에 올리기. stage에 올라온 내용만 커밋가능.



git push -u origin [현재브랜치명]
  : master가 일반적이나, 새 브랜치일 경우 origin/새브랜치명 으로 리모트 브랜치가 생성된다. 이미 있다면 해당 리모트 브랜치에 내용물이 올라간다.



4. 취소하기


git reset

 : 이전의 커밋으로 HEAD가 이동.

--mixed : (default)  인덱스는 변경사항이 저장된 곳(?)인데, 이 옵션을 추가하면 커밋만 취소되고, 실제 인덱스에는 커밋내용이 담겨져 있음. 즉, 취소한 걸 또 취소할 수 있다. 이전의 커밋으로 HEAD가 이동한다.

--hard : 작업 디렉토리(로컬 저장소)와 인덱스 동기화. 이전 커밋내용이 날아간다~~



5. 리모트 브랜치를 로컬저장소에 동기화시키기


git checkout [로컬 저장소의 브랜치]


git reset --hard [원하는 리모트 브랜치]
 : 궂이 [origin/로컬브랜치]가 아니어도 된다. 즉, 현재 master 브랜치에 있더라도 origin/abc 나 origin/def 와 같은 리모트 브랜치의 것도 동기화가 된다.

git push origin [현재 로컬 브랜치]
 : 위에서 싹 청소시킨 [원하는 리모트 브랜치]를 "origin/로컬브랜치"의 내용물로 덮어쓴다.
    명령 후 상태는 origin/로컬브랜치 = 원하는 리모트 브랜치

ex)

git checkout master

git reset --hard origin/test

git push origin master

-> origin/master = origin/test



6. 그냥 리모트 브랜치를 로컬에 가져오기(로컬에서 보기)


git checkout --track [원하는 리모트 브랜치]





Bitbucket 사용하기 (+ AWS)

1. SSH 키 생성하기


ssh-keygen

 : 로컬컴퓨터(경로는 ~/.ssh/)에서 키 생성 (passphrase-암호문은 생성안해도 괜찮음)

* .pub 확장자가 퍼블릭 키이다.



2. 생성한 Public Key는 Bitbucket 설정에서 사이트에 올릴 것


Repository Setting이 아닌 Project Setting에서 ssh public key를 등록



3. 혹시모르니 내 컴퓨터에서 키 등록


ssh-add ~/.ssh/<private_key_file>


4. 등록된 ssh 리스트 보기


ssh-add -l



5. AWS 인스턴스에서 ~/.ssh/ 에다가 1번에서 생성한 Private Key를 저장 (Not Public)


내용물을 복사해도 완전히 붙여넣기가 안될 수 있으므로 확인해야함 (이거땜에 삽질 ㅡㅡ)



6. aws 인스턴스에서 Bitbucket으로 로그인해보기


ssh  -Tv  username@bitbucket.org


(옵션은 디버깅옵션)

logged in 뜨면 성공
안뜨면 ping 찍어서 Security Group에 인바운드/아웃바운드 정책 맞게 설정했는지 볼 필요 OOOOOO


+기타 명령어)
ps -e | grep ssh-agent

 : ssh가 실행중인지 확인할 것 (실행되면 ok)



7. Bitbucket 저장소에서 내용물을 받아보자.(또는 올려보자)


git init

git clone ~~~
git remote set-url origin [HTTPS URL]

git pull --all 또는 git add --all

git commit -m ""
git push -u origin master



'Note' 카테고리의 다른 글

make 사용법 (+Makefile)  (0) 2018.06.29
GCC 사용법  (0) 2018.06.29
Domain Name System - DNS와 네임서버  (0) 2017.06.20
운영체제별 개행문자(줄바꿈문자)  (0) 2017.06.20
FPS : Frames Per Second  (1) 2017.03.28


  • DNS

- Domain Name System 의 약자로, IP 네트워크에서 사용하는 시스템이다.


- 도메인 주소를 영문/한글 주소를 IP 주소로 변환한 뒤, IP 네트워크에서 탐색하여 우리가 인터넷을 쓸 수 있게 해준다. 


- 실제로 웹사이트 주소를 도메인 대신 아이피로 외우게 되면 상당히 복잡해지기 때문에 편리성을 제공하는 시스템이라 생각하면 된다.





  • 네임 서버(Name Server)

- DNS를 운영하는 서버로, 서버 구축에 대한 지식을 기반으로 구성하는 것은 어렵지 않다. 


- 일반적으로 규모가 큰 사이트는 네임서버를 자체적으로 운영하는 경우가 많다.





  • DDNS

- Dynamic DNS의 약자로 동적 DNS를 의미한다.


- 실시간으로 DNS를 갱신하는 방식이다. 


- 주로 도메인의 IP의 이동이 많은 경우 즉, 유동적인 경우에 사용된다.


- IP가 바뀌어도 DDNS로 설정한 도메인 주소는 변하지 않기 때문에 보다 쉽게 접속이 가능하다.


- 주로 사생활 침해를 고려하여 가정에서 유동 IP를 사용한다. 여기서 DNS 주소를 할당해버리면 사용자의 IP가 바뀌게 될 경우 해당 주소로 들어온 트래픽은 다른 사용자에게 가게되므로 DDNS를 사용한다. 


- 일반적으로 유동 IP로 인터넷에 연결되는 대부분의 사용자들이 개인 서버나 NAS 구축을 할 때 DDNS를 이용하게 된다.


- 보통 집에서 사용하는 컴퓨터는 통신사(ISP)에서 기본적으로 제공하는 DNS 주소를 사용하도록 설정되어 있다. 학교 같은 경우, 전용선을 통해 인터넷에 연결하는 컴퓨터는 별도의 DNS 설정이 되어 있다. 


- 인터넷 응답 속도 향상을 위해 DNS 설정을 따로 하기도 한다.





'Note' 카테고리의 다른 글

GCC 사용법  (0) 2018.06.29
git 명령어 & Bitbucket 사용하기  (0) 2018.06.27
운영체제별 개행문자(줄바꿈문자)  (0) 2017.06.20
FPS : Frames Per Second  (1) 2017.03.28
Bitmap vs Vector - 비트맵 이미지와 벡터 이미지  (1) 2017.03.22

+ Recent posts