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 |