make를 이용한 빌드 방법

|

make 사용법

gcc를 이용한 빌드 방법

일반적으로 gcc를 이용한 빌드는 다음과 같은 형태의 명령을 이용합니다.

$ gcc -o helloworld helloworld.c

이 때 -o 옵션 뒤에는 실행 파일의 이름을 지정합니다.

하지만 실제로 프로젝트를 진행하면 수 많은 소스 코드를 사용하는데, 일일이 gcc를 이용해서 빌드하는 것은 번거롭기 때문에 make 유틸리티를 활용하면 보다 효율적으로 빌드를 할 수 있습니다.

make를 사용하기 위해서는 makefile이 필요합니다. makefile이 있는 경우에는 콘솔창에서 make만 입력해도 자동으로 빌드가 되며, 별도로 --makefile 또는 -f 옵션을 이용하여 makefile의 이름을 지정할 수도 있습니다.


makefile의 구성

makefile은 크게 목표(Target), 의존성(Dependency), 명령(Command)의 3 부분으로 이루어집니다.

target:         dependencyList
                commandList
요소 설명
targetLit 명령이 수행되어 생성될 결과 파일 지정
dependencyList target(목표)을 수행하기 위해 필요한 의존 관계 설정
commandList target을 수행하기 위해 여기에 정의된 명령이 실행됨

Command(명령)의 경우 다양한 유틸리티를 사용할 수 있습니다. 예를 들어 gcc 외에도 clear, cp 등의 대부분의 명령어를 사용할 수 있습니다. 명령의 앞 부분은 반드시 Tab을 이용해서 공백을 만들어주어야 합니다.


make 예제

다음과 같은 파일들이 존재한다고 가정해봅시다.

  • main.c
  • input.c
  • output.c

위의 파일들은 gcc를 이용했을 때 다음과 같이 빌드할 수 있습니다.

$ gcc -o snowdeerApp main.c input.c output.c

이 경우 make를 위한 makefile로 만들어보면 다음과 같습니다.

snowdeerApp :
    gcc -o snowdeerApp main.c input.c output.c

기본적으로 위와 같은 makefile을 이용하면 되지만, 향후 확장을 위해 다음과 같이 좀 더 유연하게 만들어 줄 수 있습니다.

snowdeerApp : main.o input.o output.o
    gcc -o snowdeerApp main.o input.o output.o

main.o : main.c
    gcc -c main.c

input.o : input.c
    gcc -c input.c

output.o : output.c
    gcc -c output.c


makefile의 매크로 사용

위에서 작성한 makefile에 ‘$(매크로)’ 같은 형식의 매크로 기능을 사용할 수 있습니다.

OBJECTS = main.o input.o output.o

snowdeerApp : $(OBJECTS)
    gcc -o snowdeerApp $(OBJECTS)

main.o : main.c
    gcc -c main.c

input.o : input.c
    gcc -c input.c

output.o : output.c
    gcc -c output.c

makefile을 좀 더 수정하면

OBJECTS = main.o input.o output.o
SRC = main.c input.c output.c

CFLAGS = -g
TARGET = snowdeerApp

$(TARGET) : $(OBJECTS)
    $(CC) -o $(TARGET) $(OBJECTS)

clear :
    rm -f $(OBJECTS) $(TARGET) core

main.o : main.c
input.o : input.c
output.o : output.c

와 같은 형태로 사용할 수 있습니다.


make에 이미 정의되어 있는 키워드들

위에서 $(CC)CFLAG 등의 키워드들은 make에 이미 정의되어 있는 매크로입니다.

매크로 설명
ARFLAGS ar 아카이브 관리 프로그램의 Flag
ASFLAGS as 어셈블러의 Flag
CFLAGS C 컴파일러의 Flag
CXXFLAGS C++ 컴파일러의 Flag
CPPFLAGS C 언어 전처리기(Preprocessor)의 Flag
LDFLAGS ld linker의 Flag
COFLASG co 유틸리티의 Flag
FFLAGS 포트란 컴파일러의 Flag
PFLAGS 파스칼 컴파일러의 Flag
LFLAGS lex의 Flag
YFLAGS yacc의 Flag
명령어 매크로 명령어 설명
AR ar ar 아카이브 관리 프로그램
AS as as 어셈블러
CC cc C 언어 컴파일러
CXX g++ C++ 컴파일러
CO co co 유틸리티
CPP $(CC) -E C 언어 전처리기(Preprocessor)
FC f77 포트란 컴파일러
PC pc 파스칼 컴파일러
LEX lex lex 프로세서
YACC yacc yacc 프로세서
TEX tex tex 프로세서
RM rm -f 파일 삭제


자동 변수

먼저 다음과 같은 예제를 살펴보겠습니다.

.SUFFIXES : .c .o

OBJECTS = main.o input.o output.o
SRC = main.c input.c output.c

CC = gcc
CFLAGS = -g
TARGET = snowdeerApp

$(TARGET) : $(OBJECTS)
    $(CC) -o $@ $(OBJECTS)

.c.o :
    $(CC) $(CFLAGS) -c $< -o $@

clear :
    $(RM) -f $(OBJECTS) $(TARGET) core

main.o : main.c
input.o : input.c
output.o : output.c

위에서 $(TARGET) 명령에서 빌드 옵션에 보면 $@가 있습니다. 이 항목은 현재 target으로 하는 대상의 이름을 지칭하는 옵션입니다. 그 외의 주요 자동 변수들은 다음과 같습니다.

변수 설명
$* 확장자가 없는 현재 목표 파일의 이름을 지칭
$@ 현재 목표 파일의 이름을 지칭
$< 현재 목표 파일보다 더 최근에 갱신된 파일명으로, 첫 번째 종속물의 이름
$? ’$<’와 동일

목표로 선언한 .c.o.o에 대응하는 .c를 발견하면 해당 command가 수행됩니다. $<는 확장자를 제외한 파일의 이름과 target(.c.o)의 앞 부분인 .c를 붙여서 사용되며, 뒤의 $@는 확장자를 제외한 파일의 이름과 target 뒤의 .o를 붙여서 사용됩니다.


매크로 치환

매크로 치환은 다음과 같은 명령어로 할 수 있습니다.

$(매크로 이름:이전 내용=새로운 내용)

예를 들어, 다음과 같은 형태로 사용할 수 있습니다.

# 생략
OBJECTS = main.o input.o output.o

# 생략
SRC = $(OBJECTS:.o=.c)

# 생략


다중 타켓

실행 파일을 여러 개 생성할 때 사용하는 방법입니다. makefile 안에 all이라는 target을 만들고 그 뒤에 필요한 target들을 나열하면 됩니다. 단, all의 앞에 다른 target을 넣으면 안됩니다.

# 생략
# TARGET = snowdeerApp

all : snowdeerApp helloWorld

snowdeerApp : $(OBJECTS)
    $(CC) -o $@ $(OBJECTS)

helloWorld : helloworld.c
    $(CC) -o $@ $<

# 생략

scrot를 이용한 화면 캡쳐

|

화면 캡쳐 프로그램 scrot

scrot 설치

다음 명령어를 이용하여 scrot 프로그램을 설치합니다.

$ sudo apt-get install scrot


화면 캡쳐 방법

가장 간단하게 하는 방법으로는 단순히 scrot 명령어를 실행하는 것입니다. 화면이 캡쳐되면 현재 디렉토리 안에 png 형식으로 파일이 저장됩니다.

-d 옵션을 이용하면 화면 캡쳐에 딜레이를 설정 할 수 있습니다.

$ scrot -d 5

화면의 일부만 캡쳐하고 싶을 때는 -s 옵션을 줘서 마우스도 드래그하여 영역을 설정할 수도 있습니다.

samba를 이용한 파일 공유

|

samba를 이용하여 라즈베리파이를 NAS처럼 사용하기

samba를 이용하면 라즈베리파이의 파일들을 보다 쉽게 공유할 수 있습니다. 특히 라즈베리파이에 USB 메모리 등을 연결했을 때, 그 USB 메모리를 마치 NAS처럼 사용할 수도 있습니다.


samba 설치

다음 명령어를 이용해서 samba를 설치합니다.

$ sudo apt-get install samba
$ sudo apt-get install samba-common-bin


USB 메모리를 연결

라즈베리파이에 USB 메모리를 연결하면 자동으로 /media에 마운트 됩니다.


samba 사용자 추가

samba에 사용자 pi를 추가하는 명령어입니다.

$ sudo smbpasswd -a pi
New SMB password:
Retype new SMB password:
Added user pi.


Config 파일 수정

그 후 /etc/samba/smb.conf 파일을 nano로 열어서 편집을 합니다.

workgroup = WORKGROUP

이 부분은 Windows에서 연결하는 경우에만 변경해주면 됩니다.

사용자 인증 세션 부분은 다음과 같습니다.

# security = user

이 부분에서 앞의 #을 제거하여 보안 설정을 활성화합니다.

그리고 파일 맨 뒤에 다음 내용을 추가합니다.

[USB]
path = /media/workspace
comment = USB File Sharing
valid users = pi
writeable = yes
browseable = yes
create mask = 0777
public = yes

파일을 저장한 다음 다음 명령어로 samba 서버를 재시작합니다.

sudo /etc/init.d/samba restart

VNC를 통한 라즈베리 원격 제어

|

VNC를 통한 라즈베리 원격 제어

VNC(Virtual Network Connection)를 이용하면 라즈베리파이를 원격에서 GUI 환경에서 쉽게 제어할 수 있습니다.


VNC 서버 설치

VNC(Virtual Network Connection) 서버는 다음 명령어를 이용해서 설치할 수 있습니다.

$ sudo apt-get update
$ sudo apt-get install tightvncserver


VNC 서버 실행

VNC 서버를 설치한 후, 다음 명령어를 이용해서 VNC 서버를 실행할 수 있습니다.

$ vncserver :1


VNC 서버에 접속

원격에서는 VNC 클라이언트를 설치해야 합니다. 다양한 VNC 프로그램들이 있으며, RealVNC 등을 사용할 수 있습니다.

접속할 때 IP 주소 뒤에 :1을 입력하면 화면 번호 ‘1’에 접속할 수 있습니다.


라즈베리파이 시작할 때 VNC 서버 자동 실행하기

다음 명령어를 이용해서 라즈베리파이를 시작할 때 VNC 서버를 자동으로 실행되도록 할 수 있습니다.

$ cd /home/pi
$ cd .config
$ mkdir autostart
$ cd autostart
$ nano tightvnc.desktop

그 후 tightvnc.desktop 내용에 다음을 입력합니다.

[Desktop Entry]
Type=Application
Name=TightVNC
Exec=vncserver :1
StartupNotify=false

라즈베리 파이 설정 쉽게 변경하기 (raspi-config)

|

Configuration Tool 다운로드

라즈베리파이에서는 raspi-config라는 프로그램을, 나노파이에서는 npi-config라는 프로그램을 이용해서 단말기의 설정을 쉽게 변경할 수 있습니다.

Image

raspi-config 프로그램은 다음과 같은 기능을 제공합니다.

  • pi 계정의 패스워드 변경
  • 네트워크 호스트 이름(Hostname) 변경
  • 부팅 옵션 변경
  • 언어 및 지역 설정
  • GPIO를 포함한 인터페이스(Interface) 설정
  • 오버클럭(Overclock)
  • 업데이트
  • 기타 설정


raspi-config 설치 및 실행

$ sudo apt-get install raspi-config

$ sudo raspi-config


npi-config 설치 및 실행

$ sudo apt-get install npi-config

$ sudo npi-config