본문 바로가기
2CHAECHAE 학교생활/OSNW실습

[ OS/NW 실습 ] 4주차 - 패키지 관리, 소프트웨어 컴파일

by 2CHAE._.EUN 2022. 9. 30.

[ 소프트웨어 관리하기 ]

 

우분투 패키지의 특징 : 바이너리 파일로 구성이 되어있다.

→ 소스코드를 컴파일하는 것이 아니라 바로 바이너리를 실행한다. 

 


[ APT 명령으로 패키지 관리하기 ]

 

1. apt-cache 

 

① apt-cache stats : APT 캐시 통계 정보 확인하기 → 설치되어있는 패키지들이 무엇인지 보여준다.

② apt-cache search [ 패키지이름 ] :  패키지 이름 검색하기

 ex)  apt-cache search vsftpd * vs : very security ( 매우 안전 )

 

2. apt-get 

 

apt-get은 슈퍼 사용자만 사용할 수 있다. → sudo를 사용해야한다. 

* 사용자 계정이 sudo를 사용할 수 있는 계정인지 확인하기 : groups + 사용자계정

사용자 계정이 자기 자신 그룹과 sudo를 사용할 수 있는 sudo 그룹에 포함되어있음을 확인할 수 있다.

 

* sudo cat /etc/sudoers를 통해 sudo를 사용할 수 있는 계정들을 확인할 수 있다.

( 현재 접속중인 사용자는 목록에 뜨지 않는다. )

 

① sudo apt-get update : 패키지를 갖고오는 것이 아니라 패키지 정보만 업데이트하기

 sudo apt-get upgrade : 패키지 업그레이드하기

 sudo apt-get install [ 패키지 이름 ] : 특정 패키지를 설치 또는 업그레이드

    ex) sudo apt-get install netcat

 sudo apt-get remove [ 패키지 이름 ] : 패키지 삭제하기

    ex) sudo apt-get remove netcat 

 


[ 소프트웨어 컴파일 ]

 

gcc : GNU C 컴파일러 패키지

 

1. c 프로그램 작성하기

 

nano [ 소스코드 ]

 

 ex) nano hello.c

 

* nano 설치하기

sudo apt-get install nano

 

nano 내용 저장하기 : ctrl + o

nano 나가기 : ctrl + x

 

2. 컴파일하기 

 

gcc [ 소스코드 ]

  ex) gcc hello.c

 

* gcc 설치하기 

sudo apt-get install gcc

 

gcc로 컴파일을 하게 되면 a.out 실행파일이 생성이 된다. 

소스코드는 rw권한만 가지고 있지만 a.out은 rwx 권한을 갖는다. 즉 a.out은 실행파일이다.

 

3. 실행 파일 실행하기 : ./a.out

 

명령어나 실행파일은 경로( path )가 있기 때문에 현재 디렉토리 밑에 있는 a.out을 실행해야한다.

 

4. 실행 파일 이름 변경하기

 

gcc -o [ 변경할 이름 ] [ 기존 실행파일 이름 ]

ex) gcc -o hello hello.c

      ./hello

 

* -o 옵션의 순서가 바뀌면 안된다. 

 

5. 컴파일 올리기

 

gcc -c [ 소스코드 ]

 

* 오브젝트 파일 ( obj ) : 소스 코드를 실행하는 파일이 아니라 컴파일만 실행한 파일

 

gcc -c hello.c 처럼 -c 옵션만을 사용할 경우 hello.o 같은 오브젝트 파일이 생성이 된다. 

오브젝트 파일은 실행 파일이 아니기 때문에 cat을 사용해도 제대로 읽을 수 가 없다.

 

6. 여러 소스 파일을 컴파일하고 링크하여 최종 실행 파일을 생성하기

 

① 소스코드 작성하기

 

nano main.c

#include <stdio.h>

extern void hello();

void main(){
        printf("2CHAECHAE BLOG\t");
        hello();
}

 

nano greeting.c

#include <stdio.h>

extern void world();

void hello(){
        printf("HELLO\t");
        world();
}

 

nano world.c

#include <stdio.h>

void world(){
        printf("WELCOME\n");
}

 

소스코드가 여러 개일 경우 각각 컴파일을 해줘야한다. 

 

하지만 소스코드 안에 다른 소스코드 파일에 정의된 함수가 호출이 될 경우 그 함수는 미리 다른 소스코드 파일에
위치하고 있다고 extern을 사용해서 알려줘야한다. 

 

function declaration :  함수가 다른 소스코드에 존재한다고 소스코드 안에 명시를 해주는 작업

→ Declare external function

ex) extern void hello():

      extern void world();

* 함수 리턴 타입 자료형과 extern 자료형은 같아야 한다.

 

② gcc -c 를 사용해서 컴파일 해주기

 

③ 링크 : 연결해주기 → 3개의 오브젝트 파일을 하나의 실행 파일로 링크해주기

 


[ make 명령 사용하기 ]

 

make : makefile에 설정된 정보를 읽어서 여러 소스 파일을 컴파일하고 링크하여 최종 실행 파일을 생성하는 명령어

 

최종적인 실행 파일이 나오기 위해서는 소스코드와 오브젝트 파일이 필요하다. 만약 소스코드에 변화가 생겼다면

실행 파일을 다시 생성해야한다.

 

1. makefile 파일 작성하기

 

nano makefile

 

* make  파일 입력시 복붙 하지 말고 직접 입력하는 것이 에러를 방지할 수 있다.

TARGET=chaechae
OBJECTS=main.o greeting.o world.o
$(TARGET) : $(OBJECTS) // dependency 
        gcc -o $(TARGET) $(OBJECTS) 
main.o : main.c
        gcc -c main.c
greeting.o : greeting.c
        gcc -c greeting.c
world.o : world.c
        gcc -c world.c

 

* TARGET에는 여러 개의 오브젝트 파일을 링크해서 사용할 이름을 넣어주면 된다. 

 

2. make 파일 실행하기 :  make 명령어 사용

* 오브젝트 파일 전체 삭제하기 명령어 : rm *.o

* 소스코드와 makefile을 외부에서 받아 실행시켰을 때 제대로 실행이 되지 않는다면 make 파일을

  다시 확인해볼 필요가 있다.