1. GCC(GNU Compiler Collection)

GNU 프로젝트의 일환으로 개발되어 널리 쓰이고 있는 컴파일러로, 원래는 GNU C Compiler를 의미했지만, Java, C++ 등 여러 언어를 지원하면서 GNU Compiler Collection으로 명칭이 바뀌게 되었다.

 

2. Build 방식에 따른 프로그램 언어 분류

1. Compile 언어 : compiler를 사용하여 소스 코드를 기계어로 변환, build 과정을 거쳐서 실행 파일 생성

ex) C언어, C++

2. Interpreter 언어 : source file을 한번에 번역하는 게 아니라 한 줄씩 해석하면서 즉시 실행

ex) JavaScript, Python

3. Hybird 언어 : Compile 방식과 Interpreter 방식을 모두 사용, Java의 경우 Source file(.java)을 바이트 코드(.class)로 변환하고, JVM(Java Virtual Machine)이라는 프로그램에 의해 운영체제 별로 Byte Code를 한 줄씩 운영체제에 맞는 명령어로

실행시켜줌ex) Java, C#

 

3. Compile 언어의 장점과 단점

1. 장점

  • 빌드 과정이 끝난 executable file은 실행 속도가 빠르다.

2. 단점

  • 프로그램을 수정할 경우, 처음부터 build를 해야한다.
  • 플랫폼에 의존적이다. cpu마다 어셈블리어의 명령어가 다르다.(거의 유사하지만 Windows과 mac(apple의 자체 cpu사용))

 

4. Compile 방식에서 실행 파일 빌드 과정(Building an executable file)

1) preprocessor : 전처리 과정으로 C언어의 #define이나 #include 같은 구문들을 처리 해줌.

2) compile : source file(.c)를 어셈블리 코드로 변환

3) assembler : 어셈블리 코드를 cpu가 이해할 수 있는 기계어로 번역 (object 파일 생성)

4) linker : object 파일들과 library를 묶어서 하나의 실행 파일을 생성

 

5. Visual Studio Code 실행

1) Visual Studio Code 실행

 

6. object 파일 생성

## 파일 directory 생성
$ mkdir src bin obj include lib

## file 생성
$ touch include/funcs.h src/func1.c src/func2.c src/main.c

## object 파일 생성
$ gcc -c src/funcs1.c -o obj/funcs1.o -I./include
$ gcc -c src/funcs2.c -o obj/funcs2.o -I./include

1) 명령어 설명 

-c : link는 따로 하지 않고, object 파일까지만 생성

-o : 생성된 파일의 경로 및 이름 지정

-I (대문자 I): 컴파일러에게 헤더 파일이 위치한 디렉터리를 알려주는 역

 

7. Library 생성

1) 정적 라이브러리(Static Library)와 동적 라이브러리(Dynamic Library) 차이

정적 라이브러리 : .lib(Windows) 또는 .a(Unix/Linux)의 확장자를 가지며, 컴파일시에 실행 파일에 포함되고, 그에 따라 실행파일의 크기가 커짐, 런타임에 외부 라이브러리에 대한 의존성이 없음.

 

동적 라이브러리 : .dll(Windows) 또는 .so(Unix/Linux)의 확장자를 가지며, 런타임시에 프로그램이 필요할 떄 로드가 되고, 실행 파일의 크기가 작아지고, 메모리를 효율적으로 사용할 수 있다는 장점이 있지만, 런타임에 외부 라이브러리에 대한 의존성이 있음.

 

2) 정적 라이브러리 파일 생성

 

2-1) 정적 라이브러리 생성 

ar rv lib/lib(library이름).a (obj 파일들)  

 

2-2) link (정적 라이브러리 + main.obj)

-o : 만들고자하는 파일 이름

-I(대문자) : 컴파일러에게 헤더파일 경로를 알려줌

-l(소문자) : 컴파일러에게 라이브러리 이름을 알려줌

-L: 컴파일러에게 라이브러리 경로를 알려줌

 

 

3) 동적 라이브러리 생성

 

3-1) 동적 라이브러리 생성

## -fPIC를 이용해서 object 파일 생성
$ gcc -fPIC -c src/funcs1.c -I./include -o obj/funcs1.o
$ gcc -fPIC -c src/funcs2.c -I./include -o obj/funcs2.o

## 환경 변수설정 (export는 껐다키면 사라짐)
$ export LD_LIBRARY_PATH=$HOME/opensw/studylibrary/lib
## 환경 변수 확인
$ echo $LD_LIBRARY_PATH

## 동적 library 생성
$ gcc -fPIC -shared -Wl,-soname=libmyfuncs.so.1 obj/*.o -o lib/libmyfuncs.so.1.0 -lc

## softlink
$ ln -s libmyfuncs.so.1.0 lib/libmyfuncs.so.1
$ ln -s libmyfuncs.so.1.0 lib/libmyfuncs.so

$ tree

-fPIC : 메모리에 로딩되는 위치에 상관없이 실행될 수 있는 코드를 의미, 동적 라이브러리나 공유 라이브러리 생성할 때 사용

-l(소문자 l) : 라이브러리 파일을 지정

-L : 컴파일러에게 라이브러리 파일이 위치한 디렉터리를 알려주는 역할

-shared : default가 shared 이지만 가독성을 위해 사용

-Wl(소문자 l) : 다음에 오는 옵션을 링커에게 전달하는 역할

-lc : c 프로그램이 실행될 때, 필요한 기본적인 함수 포함하는 라이브러리

 

 

3-2) link (동적 라이브러리 + main.obj)

 

라이브러리 경로 표시

 

$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib

 

$ gcc src/main.c -I./include -o bin/myapp.lib -lmyfuncs -L./lib

 

 

'Ubuntu Linux' 카테고리의 다른 글

[Ubuntu Linux] 버전 관리 시스템(VCS)과 git  (0) 2023.11.02
[Ubuntu Linux] ShellScript  (0) 2023.10.26
[Ubuntu Linux] 가상 환경 설정 하기  (0) 2023.10.23

+ Recent posts