Skip to content

Commit

Permalink
Merge pull request #1 from Seong-Myeong/by_myeong_gcc
Browse files Browse the repository at this point in the history
hello world, gcc and recent summary.md
  • Loading branch information
Seong-Myeong authored Nov 26, 2020
2 parents a7efdb7 + 35918b8 commit cecc968
Show file tree
Hide file tree
Showing 6 changed files with 223 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@
- [μ†Œν”„νŠΈμ›¨μ–΄λ„ κ²°κ΅­ 이 ꡬ쑰둜 이루어진닀]()
- [ν„°λ―Έλ„μ—μ„œ νŒŒλ„νƒ€κΈ°]()
- [λ‹€μ‹œ ν•œ 번 Hello, World!](hello_world.md)
-[gcc κΈ°λ³Έ μ»€λ§¨λ“œ μ„€λͺ…](gcc_1.md)
-[gcc에 λŒ€ν•œ κΈ°λ³Έ 이해](gcc_2.md)
-[gcc μ‚¬μš©ν•˜κΈ°](gcc_3.md)
-[κ°„λ‹¨ν•˜κ²Œ c++둜 Hello World 좜λ ₯ν•˜κΈ°](gcc_4.md)
- [VCS, 그리고 μ˜€ν”ˆμ†ŒμŠ€](vcs_and_opensource.md)
- [VCSλž€?]()
- [git, 그리고 GitHub]()
Expand Down
6 changes: 6 additions & 0 deletions src/gcc_1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
### gcc κΈ°λ³Έ μ»€λ§¨λ“œ μ„€λͺ…

gccλž€! GNU 컴파일러 λͺ¨μŒ(GNU Compiler Collection, μ€„μ—¬μ„œ GCC)λŠ” GNU ν”„λ‘œμ νŠΈμ˜ μΌν™˜μœΌλ‘œ κ°œλ°œλ˜μ–΄ 널리 쓰이고 μžˆλŠ” μ»΄νŒŒμΌλŸ¬μž…λ‹ˆλ‹€. 자유 μ†Œν”„νŠΈμ›¨μ–΄ 쀑에 κ°€μž₯ 잘 μ•Œλ €μ§„ 것듀 쀑 ν•˜λ‚˜μ΄μ£ .
μ›λž˜ GCCλŠ” Cλ§Œμ„ μ§€μ›ν–ˆλ˜ 컴파일러둜 이름도 "GNU C 컴파일러"μ—Ώμ§€λ§Œ, 후에 C++, Java, Fortran, Ada λ“± μ—¬λŸ¬ μ–Έμ–΄λ₯Ό μ»΄νŒŒμΌν•  수 있게 λ˜λ©΄μ„œ, ν˜„μž¬μ˜ μ΄λ¦„μœΌλ‘œ λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.
GCCλŠ” λ¦¬μ²˜λ“œ μŠ€ν†¨λ§Œμ΄ 1987λ…„ GNU ν”„λ‘œμ νŠΈμ˜ 컴파일러둜 μž‘μ„±ν–ˆμ”λ‹ˆλ‹€. GNU ν”„λ‘œμ νŠΈμ— μ»΄νŒŒμΌλŸ¬κ°€ μ—†μ—ˆκΈ° λ•Œλ¬Έμ— 이 κ°œλ°œμ€ 자유 μ†Œν”„νŠΈμ›¨μ–΄ μž¬λ‹¨μ΄ ν›„μ›ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 1997λ…„ 개발 과정은 κ³΅κ°œλ˜μ—ˆμœΌλ©°, 속도 λ˜ν•œ λΉ¨λΌμ‘ŒμŠ΅λ‹ˆλ‹€. 199λ…„ 첫 λ²ˆμ „μ΄ λ‚˜μ™”λŠ”λ° ν˜„μž¬ GCCλŠ” μ „μ„Έκ³„μ μœΌλ‘œ κ΄€λ¦¬λ˜κ³  있으며, λ‹€μ–‘ν•œ 쀑앙 처리 μž₯치λ₯Ό μ²˜λ¦¬ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
GNU μ‹œμŠ€ν…œμ˜ 곡식 μ»΄νŒŒμΌλŸ¬μ΄λ―€λ‘œ GCCλŠ” λ§Žμ€ μ»΄νŒŒμΌλŸ¬μ™€ 운영 체제λ₯Ό λ§Œλ“œλŠ”λ° μ‚¬μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν•œνŽΈ, μ‹œμŠ€ν…œ λ„€μ΄ν‹°λΈŒ 컴파일러λ₯Ό μ‚¬μš©ν–ˆμ„λ•Œ λΉ„ν•΄μ„œ GCCλ₯Ό μ‚¬μš©ν•˜λ©΄ 같은 νŒŒμ„œλ‘œ μ½”λ“œλ₯Ό μ²˜λ¦¬ν•˜λ―€λ‘œ 이식성을 ν–₯μƒμ‹œν‚¬ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. GCCλŠ” μƒμš© μ»΄νŒŒμΌλŸ¬μ— λΉ„ν•΄μ„œ 느린 μ½”λ“œλ₯Ό μƒμ„±ν–ˆμ§€λ§Œ 졜근 많이 κ°œμ„ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
40 changes: 40 additions & 0 deletions src/gcc_2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
### gcc에 λŒ€ν•œ κΈ°λ³Έ 이해

gccλ₯Ό μ†ŒμŠ€λ₯Ό κ°€μ Έλ‹€ μ†μˆ˜ μ„€μΉ˜ν•΄λ³΄μ‹  적은 없을 κ²ƒμž…λ‹ˆλ‹€. 보톡은 λ°”μ΄λ„ˆλ¦¬ νŒ¨ν‚€μ§€λ‘œ 된 것을 κ°€μ Έλ‹€ μ„€μΉ˜λ₯Όν•΄μš”! gcc νŒ¨ν‚€μ§€κ°€ μ–΄λ–€ κ²ƒμœΌλ‘œ κ΅¬μ„±λ˜μ–΄μžˆλŠ”μ§€! gccκ°€ μ œλŒ€λ‘œ μ„€μΉ˜λ˜μ–΄ μžˆλŠ”μ§€ μ•Œλ³΄λ΄…μ‹œλ‹€

/lib/cpp ----> /usr/lib/gcc-lib/i386-linux/2.7.2.1/cpp (링크)
/usr/bin/cc ----> gcc (링크)
/usr/bin/gcc C 컴파일러 'front-end'
/usr/bin/protoize
/usr/bin/unprotoize
/usr/info/cpp.info->.gz GNU info μ‹œμŠ€ν…œμ„ μ΄μš©ν•˜λŠ” νŒŒμΌλ“€
/usr/info/gcc.info->.gz
/usr/lib/gcc-lib

λ§ˆμ§€λ§‰ /usr/lib/gcc-lib 디렉토리에 gcc에 κ΄€ν•œ λͺ¨λ“  λ‚΄μš©μ΄ μ„€μΉ˜λ©λ‹ˆλ‹€.

보톡은 μ΄λŸ¬ν•œ ν˜•μ‹μœΌλ‘œ 디렉토리 ꡬ쑰λ₯Ό κ°€μ§‘λ‹ˆλ‹€.
/usr/lib/gcc-lib/<ν”Œλž«νΌ>/<gcc 버전>

/usr/lib/gcc-lib λ°‘μ˜ λ‚΄μš©μ„ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€

/usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1
/usr/lib/gcc-lib/i386-linux/2.7.2.1/cpp
/usr/lib/gcc-lib/i386-linux/2.7.2.1/include/*.h
/usr/lib/gcc-lib/i386-linux/2.7.2.1/libgcc.a
/usr/lib/gcc-lib/i386-linux/2.7.2.1/specs

cc1은 μ§„μ§œ C 컴파일러 λ³Έμ²΄μž…λ‹ˆλ‹€. gccλŠ” 단지 μ μ ˆν•˜κ²Œ C인지 c++인지 μ•„λ‹ˆλ©΄ μ˜€νŠΈμ ν‹°λΈŒ C 인지λ₯Ό κ²€μ‚¬ν•˜λ©° 컴파일 μž‘μ—…λ§Œ μ•„λ‹ˆλΌ __"링크"__ λΌλŠ” μž‘μ—…κΉŒμ§€ C μ–Έμ–΄λ‘œ ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€λ₯Ό λ§Œλ“  λ‹€μŒ, ν”„λ‘œκ·Έλž¨ λ°”μ΄λ„ˆλ¦¬κ°€ λ§Œλ“€μ–΄μ§€κΈ°κΉŒμ§€μ˜ λͺ¨λ“  과정을 κ΄€μž₯ν•΄μ£ΌλŠ” "μ‘°μ •μž"역할을 ν•΄μ€λ‹ˆλ‹€.

C μ»΄νŒŒμΌλŸ¬λŠ” cc1, C++ μ»΄νŒŒμΌλŸ¬λŠ” cc1plus, μ˜€λΈŒμ ν‹°λΈŒ C μ»΄νŒŒμΌλŸ¬λŠ” cc1objμž…λ‹ˆλ‹€. μ—¬λŸ¬λΆ„μ΄ C++/μ˜€λΈŒμ ν‹°λΈŒ C 컴파일러λ₯Ό μ„€μΉ˜ν•˜μ…¨λ‹€λ©΄ cc1plus, cc1obj λΌλŠ” μ‹€ν–‰νŒŒμΌλ„ μ°Ύμ•„λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. cppλŠ” "ν”„λ¦¬ν”„λ‘œμ„Έμ„œ"μž…λ‹ˆλ‹€. #include λ“±μ˜ 본격적인 cc1 μ»΄νŒŒμΌμ— 듀어가기에 μ•žμ„œ λ¨Όμ €(pre) 처리(process)ν•΄μ£ΌλŠ” λ…€μ„μž…λ‹ˆλ‹€.

g++ 즉 C++ μ»΄νŒŒμΌλŸ¬μ— λŒ€ν•œ νŒ¨ν‚€μ§€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
/usr/bin/c++ ---------------------------------> (링크)
/usr/bin/g++
/usr/bin/gcc-lib/i386-linux/2.7.2.1/cc1plus (μ§„μ§œ C++ 컴파일러)

μ˜€λΈŒμ ν‹°λΈŒ C 컴파일러 νŒ¨ν‚€μ§€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

/usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1obj
/usr/lib/gcc-lib/i386-linux/2.7.2.1/include/objc/*.h
/usr/lib/gcc-lib/i386-linux/2.7.2.1/libobjc.a
41 changes: 41 additions & 0 deletions src/gcc_3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
### gcc μ‚¬μš©ν•˜κΈ°

``` c
#include <stdio.h>

int main (void) {
printf("Hello World!");

retrun 0;
}
```
μœ„μ˜ μ½”λ“œλ‘œ Hello World!λ₯Ό 좜λ ₯ν•΄λ΄…μ‹œλ‹€. μ»΄νŒŒμΌμ„ ν•˜κΈ°μ „μ—
헀더와 mainν•¨μˆ˜, μž…μΆœλ ₯에 λŒ€ν•΄μ„œ μ•Œμ•„λ΄…μ‹œλ‹€
μœ„μ˜ μ½”λ“œμ—μ„œλŠ” stdio.hλΌλŠ” 헀더 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν–ˆλŠ”λ°μš” μ•„λž˜μ—μ„œ μ“΄ printfν•¨μˆ˜ μ›λž˜ κΈ°λ³Έ ν˜•μ€ printf()μž…λ‹ˆλ‹€. κ΄„ν˜Έκ°€ λΆ™μ–΄μžˆμœΌλ©΄ λŒ€λ‹€μˆ˜ ν•¨μˆ˜λΌκ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 μ΄λŠ” ν•¨μˆ˜λΌλŠ” μ μΈλ°μš”. 보톡 μ΄λ ‡κ²Œ μƒκ°ν•©λ‹ˆλ‹€. __"μš°λ¦¬λŠ” μ € ν•¨μˆ˜λ₯Ό μ„ μ–Έν•΄μ€€ 적이 μ—†λŠ”λ°?"__ 라고 생각 ν•  수 μžˆλŠ”λ°μš”. μ•„λ‹ˆμ—μš”! 사싀 μ €ν¬λŠ” ν•¨μˆ˜λ₯Ό μ„ μ–Έν–ˆλ‹΅λ‹ˆλ‹€~
λ°”λ‘œ #include <stdio.h> 이 λΆ€λΆ„μ—μ„œ μ‚¬μš©ν–ˆμ–΄μš”.
#include<stdio.h>μ—μ„œ printfλ₯Ό ν¬ν•¨ν•œ μ—¬λŸ¬ ν•¨μˆ˜λ“€μ„ μ„ μ–Έν–ˆλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. λ‹€λ₯Έ 헀더 νŒŒμΌλ„ μžˆλŠ”λ° μ΄λŠ” 각각의'~.h'와 같은 λ°©μ‹μœΌλ‘œ μ—¬λŸ¬κ°€μ§€ ν•¨μˆ˜λ“€μ΄ __'μ„ μ–Έ'__ λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€! 이λ₯Ό #includeμ•ˆμ— λ„£μœΌλ©΄ λ©λ‹ˆλ‹€.
λ˜ν•œ μ—¬κΈ°μ„œ μ‚¬μš©λœ printfλŠ” 좜λ ₯ ν•¨μˆ˜λ‘œ 좜λ ₯ λ‚΄μš©μ„ ν˜•μ‹κ³Ό 같이 λ‚˜νƒ€λ‚˜κ²Œ 되면 μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€. scanf도 μžˆλŠ”λ° μ΄λŠ” μž…λ ₯ ν•¨μˆ˜μ΄λ©° printf와 같이 ν˜•μ‹κ³Ό 같이 ν‘œν˜„ν•˜λ©΄ μž…λ ₯을 받을 수 μžˆκ²Œλ©λ‹ˆλ‹€.
이제 헀더와 μž…μΆœλ ₯ ν•¨μˆ˜μ— λŒ€ν•΄ μ•Œμ•˜μœΌλ‹ˆ main ν•¨μˆ˜μ˜ 원리에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€
``` c
int main() {
λ‚΄μš©
return 0;
}
```
μ΄λŠ” mainν•¨μˆ˜μΈλ°μš” cμ–Έμ–΄μ—μ„œλŠ” mainμ΄λΌλŠ” ν•¨μˆ˜λ₯Ό μ“°λ©΄ ν”„λ‘œκ·Έλž¨μ΄ 싀행됨을 μ˜λ―Έν•˜λ©°, __'0의 값이 λ°˜ν™˜λ  경우, ν”„λ‘œκ·Έλž¨μ΄ μ •μƒμ μœΌλ‘œ λ§ˆμ³€μœΌλ‹ˆ μ’…λ£Œν•΄λΌ'__ λΌλŠ” 의미λ₯Ό κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.

이제 μ»΄νŒŒμΌν•˜κ³  μ‹€ν–‰ νŒŒμΌμ„ λ§Œλ“€μ–΄ λ΄…μ‹œλ‹€.

gcc hello.c -o hello.out 이λ₯Ό ν†΅ν•΄μ„œ μ»΄νŒŒμΌμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό μ‹€ν–‰ ν• λ•ŒλŠ” ./hello.out μ΄λ ‡κ²Œ 치면 λ‚˜μ˜€λŠ”λ°μš” μœ λ‹‰μŠ€λŠ” 기본적으둜 PATHλΌλŠ” ν™˜κ²½λ³€μˆ˜μ— μžˆλŠ” λ””λ ‰ν† λ¦¬μ—μ„œλ§Œ μ‹€ν–‰νŒŒμΌμ„ μ°ΎμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ PATHλΌλŠ” ν™˜κ²½λ³€μˆ˜μ— ν˜„μž¬λ””λ ‰ν† λ¦¬λ₯Ό μ˜λ―Έν•˜λŠ” λ„νŠΈ 문자(.)κ°€ λ“€μ–΄μžˆμ§€ μ•Šλ‹€λ©΄ ν˜„μž¬ λ””λ ‰ν† λ¦¬μ˜ μ‹€ν–‰νŒŒμΌμ€ μ ˆλŒ€ μ‹€ν–‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ²Œλ‹€κ°€ ν˜„μž¬ 디렉토리λ₯Ό PATH ν™˜κ²½ λ³€μˆ˜μ— λ„£μ–΄μ€€λ‹€ 할지라도 λ„μŠ€μ²˜λŸΌ ν˜„μž¬ 디렉토리λ₯Ό λ¨Όμ € μ°ΎλŠ” 일이 μ—†κ³  PATH에 μ§€μ •ν•œ μˆœμ„œλŒ€λ‘œ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

쀑간에 -o에 λŒ€ν•΄μ„œ λ³Ό 수 μžˆμ—ˆλŠ”λ°μš” μ΄λŠ” 좜λ ₯ 파일λͺ…을 μ •ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€. μΌλ°˜μ μœΌλ‘œλŠ” 파일λͺ… κ·ΈλŒ€λ‘œμ—λ‹€κ°€ .out으둜 좜λ ₯ νŒŒμΌμ΄λΌλŠ” 것을 μ˜λ―Έν•˜λ©° 이 μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  gcc hello.cλ₯Ό μž…λ ₯ν–ˆμ„ λ•ŒλŠ” a.out으둜 좜λ ₯ 파일이 μƒμ„±λ©λ‹ˆλ‹€.

이외에도 -c, -l, -L μ˜΅μ…˜μ΄ μ‘΄μž¬ν•˜λŠ”λ°μš”. μ΄λŠ” 쒀더 μ‹¬ν™”λœ κ²ƒμœΌλ‘œ 이번 μ±•ν„°μ—μ„œλŠ” 닀루지 μ•Šλ„λ‘ ν•©λ‹ˆλ‹€! λ‚˜μ€‘μ— 심화λ₯Ό ν•˜κ²Œλœλ‹€λ©° λ°°μš°λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€!!
19 changes: 19 additions & 0 deletions src/gcc_4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
### κ°„λ‹¨ν•˜κ²Œ c++둜 Hello World 좜λ ₯ν•˜κΈ°

``` c++
#include <iostream>

int main(Void) {
cout << "Hello World!";
return 0;
}
```
c++μ—λŠ” stdio.h와 λΉ„μŠ·ν•˜κ²Œ iostream헀더가 μž…μΆœλ ₯ 해더와 λ‹€λ₯Έ ν•¨μˆ˜λ“€μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€. printf와 λΉ„μŠ·ν•œ 것은 cout이며 μ΄μ™Έμ—λŠ” cμ—μ„œ 배운 것과 κ°™μŠ΅λ‹ˆλ‹€
이λ₯Ό 컴파일 ν•΄λ΄…μ‹œλ‹€
g++ hello.cpp -o hello.out
c++의 ν™•μž₯μžλŠ” cppμ΄λ―€λ‘œ 이λ₯Ό μ‚¬μš©ν•΄μ£Όκ³  c++μ΄λ―€λ‘œ g++을 ν†΅ν•˜μ—¬ μ»΄νŒŒμΌμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€!!
__c와 c++ μ–Έμ–΄μ—μ„œμ˜ Hello Worldλ₯Ό 좜λ ₯ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜μœΌλ©° 이제 λ‹€μŒμ±•ν„°λ‘œ λ„˜μ–΄κ°€λ΄…μ‹œλ‹€!!__
113 changes: 113 additions & 0 deletions src/hello_world.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
# C++κ³Ό gccλ₯Ό μ΄μš©ν•˜μ—¬ hello, world μ½˜μ†”μ— 좜λ ₯보기!!

그전에 gcc에 λŒ€ν•΄μ„œ μ•Œμ•„λ΄…μ‹œλ‹€.

### gcc κΈ°λ³Έ μ»€λ§¨λ“œ μ„€λͺ…

gccλž€! GNU 컴파일러 λͺ¨μŒ(GNU Compiler Collection, μ€„μ—¬μ„œ GCC)λŠ” GNU ν”„λ‘œμ νŠΈμ˜ μΌν™˜μœΌλ‘œ κ°œλ°œλ˜μ–΄ 널리 쓰이고 μžˆλŠ” μ»΄νŒŒμΌλŸ¬μž…λ‹ˆλ‹€. 자유 μ†Œν”„νŠΈμ›¨μ–΄ 쀑에 κ°€μž₯ 잘 μ•Œλ €μ§„ 것듀 쀑 ν•˜λ‚˜μ΄μ£ .
μ›λž˜ GCCλŠ” Cλ§Œμ„ μ§€μ›ν–ˆλ˜ 컴파일러둜 이름도 "GNU C 컴파일러"μ—Ώμ§€λ§Œ, 후에 C++, Java, Fortran, Ada λ“± μ—¬λŸ¬ μ–Έμ–΄λ₯Ό μ»΄νŒŒμΌν•  수 있게 λ˜λ©΄μ„œ, ν˜„μž¬μ˜ μ΄λ¦„μœΌλ‘œ λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.
GCCλŠ” λ¦¬μ²˜λ“œ μŠ€ν†¨λ§Œμ΄ 1987λ…„ GNU ν”„λ‘œμ νŠΈμ˜ 컴파일러둜 μž‘μ„±ν–ˆμ”λ‹ˆλ‹€. GNU ν”„λ‘œμ νŠΈμ— μ»΄νŒŒμΌλŸ¬κ°€ μ—†μ—ˆκΈ° λ•Œλ¬Έμ— 이 κ°œλ°œμ€ 자유 μ†Œν”„νŠΈμ›¨μ–΄ μž¬λ‹¨μ΄ ν›„μ›ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 1997λ…„ 개발 과정은 κ³΅κ°œλ˜μ—ˆμœΌλ©°, 속도 λ˜ν•œ λΉ¨λΌμ‘ŒμŠ΅λ‹ˆλ‹€. 199λ…„ 첫 λ²ˆμ „μ΄ λ‚˜μ™”λŠ”λ° ν˜„μž¬ GCCλŠ” μ „μ„Έκ³„μ μœΌλ‘œ κ΄€λ¦¬λ˜κ³  있으며, λ‹€μ–‘ν•œ 쀑앙 처리 μž₯치λ₯Ό μ²˜λ¦¬ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
GNU μ‹œμŠ€ν…œμ˜ 곡식 μ»΄νŒŒμΌλŸ¬μ΄λ―€λ‘œ GCCλŠ” λ§Žμ€ μ»΄νŒŒμΌλŸ¬μ™€ 운영 체제λ₯Ό λ§Œλ“œλŠ”λ° μ‚¬μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν•œνŽΈ, μ‹œμŠ€ν…œ λ„€μ΄ν‹°λΈŒ 컴파일러λ₯Ό μ‚¬μš©ν–ˆμ„λ•Œ λΉ„ν•΄μ„œ GCCλ₯Ό μ‚¬μš©ν•˜λ©΄ 같은 νŒŒμ„œλ‘œ μ½”λ“œλ₯Ό μ²˜λ¦¬ν•˜λ―€λ‘œ 이식성을 ν–₯μƒμ‹œν‚¬ 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. GCCλŠ” μƒμš© μ»΄νŒŒμΌλŸ¬μ— λΉ„ν•΄μ„œ 느린 μ½”λ“œλ₯Ό μƒμ„±ν–ˆμ§€λ§Œ 졜근 많이 κ°œμ„ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

### gcc에 λŒ€ν•œ κΈ°λ³Έ 이해

gccλ₯Ό μ†ŒμŠ€λ₯Ό κ°€μ Έλ‹€ μ†μˆ˜ μ„€μΉ˜ν•΄λ³΄μ‹  적은 없을 κ²ƒμž…λ‹ˆλ‹€. 보톡은 λ°”μ΄λ„ˆλ¦¬ νŒ¨ν‚€μ§€λ‘œ 된 것을 κ°€μ Έλ‹€ μ„€μΉ˜λ₯Όν•΄μš”! gcc νŒ¨ν‚€μ§€κ°€ μ–΄λ–€ κ²ƒμœΌλ‘œ κ΅¬μ„±λ˜μ–΄μžˆλŠ”μ§€! gccκ°€ μ œλŒ€λ‘œ μ„€μΉ˜λ˜μ–΄ μžˆλŠ”μ§€ μ•Œλ³΄λ΄…μ‹œλ‹€

/lib/cpp ----> /usr/lib/gcc-lib/i386-linux/2.7.2.1/cpp (링크)
/usr/bin/cc ----> gcc (링크)
/usr/bin/gcc C 컴파일러 'front-end'
/usr/bin/protoize
/usr/bin/unprotoize
/usr/info/cpp.info->.gz GNU info μ‹œμŠ€ν…œμ„ μ΄μš©ν•˜λŠ” νŒŒμΌλ“€
/usr/info/gcc.info->.gz
/usr/lib/gcc-lib

λ§ˆμ§€λ§‰ /usr/lib/gcc-lib 디렉토리에 gcc에 κ΄€ν•œ λͺ¨λ“  λ‚΄μš©μ΄ μ„€μΉ˜λ©λ‹ˆλ‹€.

보톡은 μ΄λŸ¬ν•œ ν˜•μ‹μœΌλ‘œ 디렉토리 ꡬ쑰λ₯Ό κ°€μ§‘λ‹ˆλ‹€.
/usr/lib/gcc-lib/<ν”Œλž«νΌ>/<gcc 버전>

/usr/lib/gcc-lib λ°‘μ˜ λ‚΄μš©μ„ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€

/usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1
/usr/lib/gcc-lib/i386-linux/2.7.2.1/cpp
/usr/lib/gcc-lib/i386-linux/2.7.2.1/include/*.h
/usr/lib/gcc-lib/i386-linux/2.7.2.1/libgcc.a
/usr/lib/gcc-lib/i386-linux/2.7.2.1/specs

cc1은 μ§„μ§œ C 컴파일러 λ³Έμ²΄μž…λ‹ˆλ‹€. gccλŠ” 단지 μ μ ˆν•˜κ²Œ C인지 c++인지 μ•„λ‹ˆλ©΄ μ˜€νŠΈμ ν‹°λΈŒ C 인지λ₯Ό κ²€μ‚¬ν•˜λ©° 컴파일 μž‘μ—…λ§Œ μ•„λ‹ˆλΌ __"링크"__ λΌλŠ” μž‘μ—…κΉŒμ§€ C μ–Έμ–΄λ‘œ ν”„λ‘œκ·Έλž¨ μ†ŒμŠ€λ₯Ό λ§Œλ“  λ‹€μŒ, ν”„λ‘œκ·Έλž¨ λ°”μ΄λ„ˆλ¦¬κ°€ λ§Œλ“€μ–΄μ§€κΈ°κΉŒμ§€μ˜ λͺ¨λ“  과정을 κ΄€μž₯ν•΄μ£ΌλŠ” "μ‘°μ •μž"역할을 ν•΄μ€λ‹ˆλ‹€.

C μ»΄νŒŒμΌλŸ¬λŠ” cc1, C++ μ»΄νŒŒμΌλŸ¬λŠ” cc1plus, μ˜€λΈŒμ ν‹°λΈŒ C μ»΄νŒŒμΌλŸ¬λŠ” cc1objμž…λ‹ˆλ‹€. μ—¬λŸ¬λΆ„μ΄ C++/μ˜€λΈŒμ ν‹°λΈŒ C 컴파일러λ₯Ό μ„€μΉ˜ν•˜μ…¨λ‹€λ©΄ cc1plus, cc1obj λΌλŠ” μ‹€ν–‰νŒŒμΌλ„ μ°Ύμ•„λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. cppλŠ” "ν”„λ¦¬ν”„λ‘œμ„Έμ„œ"μž…λ‹ˆλ‹€. #include λ“±μ˜ 본격적인 cc1 μ»΄νŒŒμΌμ— 듀어가기에 μ•žμ„œ λ¨Όμ €(pre) 처리(process)ν•΄μ£ΌλŠ” λ…€μ„μž…λ‹ˆλ‹€.

g++ 즉 C++ μ»΄νŒŒμΌλŸ¬μ— λŒ€ν•œ νŒ¨ν‚€μ§€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
/usr/bin/c++ ---------------------------------> (링크)
/usr/bin/g++
/usr/bin/gcc-lib/i386-linux/2.7.2.1/cc1plus (μ§„μ§œ C++ 컴파일러)

μ˜€λΈŒμ ν‹°λΈŒ C 컴파일러 νŒ¨ν‚€μ§€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

/usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1obj
/usr/lib/gcc-lib/i386-linux/2.7.2.1/include/objc/*.h
/usr/lib/gcc-lib/i386-linux/2.7.2.1/libobjc.a

### gcc μ‚¬μš©ν•˜κΈ°

``` c
#include <stdio.h>

int main (void) {
printf("Hello World!");

retrun 0;
}
```
μœ„μ˜ μ½”λ“œλ‘œ Hello World!λ₯Ό 좜λ ₯ν•΄λ΄…μ‹œλ‹€. μ»΄νŒŒμΌμ„ ν•˜κΈ°μ „μ—
헀더와 mainν•¨μˆ˜, μž…μΆœλ ₯에 λŒ€ν•΄μ„œ μ•Œμ•„λ΄…μ‹œλ‹€
μœ„μ˜ μ½”λ“œμ—μ„œλŠ” stdio.hλΌλŠ” 헀더 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν–ˆλŠ”λ°μš” μ•„λž˜μ—μ„œ μ“΄ printfν•¨μˆ˜ μ›λž˜ κΈ°λ³Έ ν˜•μ€ printf()μž…λ‹ˆλ‹€. κ΄„ν˜Έκ°€ λΆ™μ–΄μžˆμœΌλ©΄ λŒ€λ‹€μˆ˜ ν•¨μˆ˜λΌκ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 μ΄λŠ” ν•¨μˆ˜λΌλŠ” μ μΈλ°μš”. 보톡 μ΄λ ‡κ²Œ μƒκ°ν•©λ‹ˆλ‹€. __"μš°λ¦¬λŠ” μ € ν•¨μˆ˜λ₯Ό μ„ μ–Έν•΄μ€€ 적이 μ—†λŠ”λ°?"__ 라고 생각 ν•  수 μžˆλŠ”λ°μš”. μ•„λ‹ˆμ—μš”! 사싀 μ €ν¬λŠ” ν•¨μˆ˜λ₯Ό μ„ μ–Έν–ˆλ‹΅λ‹ˆλ‹€~
λ°”λ‘œ #include <stdio.h> 이 λΆ€λΆ„μ—μ„œ μ‚¬μš©ν–ˆμ–΄μš”.
#include<stdio.h>μ—μ„œ printfλ₯Ό ν¬ν•¨ν•œ μ—¬λŸ¬ ν•¨μˆ˜λ“€μ„ μ„ μ–Έν–ˆλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. λ‹€λ₯Έ 헀더 νŒŒμΌλ„ μžˆλŠ”λ° μ΄λŠ” 각각의'~.h'와 같은 λ°©μ‹μœΌλ‘œ μ—¬λŸ¬κ°€μ§€ ν•¨μˆ˜λ“€μ΄ __'μ„ μ–Έ'__ λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€! 이λ₯Ό #includeμ•ˆμ— λ„£μœΌλ©΄ λ©λ‹ˆλ‹€.
λ˜ν•œ μ—¬κΈ°μ„œ μ‚¬μš©λœ printfλŠ” 좜λ ₯ ν•¨μˆ˜λ‘œ 좜λ ₯ λ‚΄μš©μ„ ν˜•μ‹κ³Ό 같이 λ‚˜νƒ€λ‚˜κ²Œ 되면 μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€. scanf도 μžˆλŠ”λ° μ΄λŠ” μž…λ ₯ ν•¨μˆ˜μ΄λ©° printf와 같이 ν˜•μ‹κ³Ό 같이 ν‘œν˜„ν•˜λ©΄ μž…λ ₯을 받을 수 μžˆκ²Œλ©λ‹ˆλ‹€.
이제 헀더와 μž…μΆœλ ₯ ν•¨μˆ˜μ— λŒ€ν•΄ μ•Œμ•˜μœΌλ‹ˆ main ν•¨μˆ˜μ˜ 원리에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€
``` c
int main() {
λ‚΄μš©
return 0;
}
```
μ΄λŠ” mainν•¨μˆ˜μΈλ°μš” cμ–Έμ–΄μ—μ„œλŠ” mainμ΄λΌλŠ” ν•¨μˆ˜λ₯Ό μ“°λ©΄ ν”„λ‘œκ·Έλž¨μ΄ 싀행됨을 μ˜λ―Έν•˜λ©°, __'0의 값이 λ°˜ν™˜λ  경우, ν”„λ‘œκ·Έλž¨μ΄ μ •μƒμ μœΌλ‘œ λ§ˆμ³€μœΌλ‹ˆ μ’…λ£Œν•΄λΌ'__ λΌλŠ” 의미λ₯Ό κ°–κ³  μžˆμŠ΅λ‹ˆλ‹€.

이제 μ»΄νŒŒμΌν•˜κ³  μ‹€ν–‰ νŒŒμΌμ„ λ§Œλ“€μ–΄ λ΄…μ‹œλ‹€.

gcc hello.c -o hello.out 이λ₯Ό ν†΅ν•΄μ„œ μ»΄νŒŒμΌμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이λ₯Ό μ‹€ν–‰ ν• λ•ŒλŠ” ./hello.out μ΄λ ‡κ²Œ 치면 λ‚˜μ˜€λŠ”λ°μš” μœ λ‹‰μŠ€λŠ” 기본적으둜 PATHλΌλŠ” ν™˜κ²½λ³€μˆ˜μ— μžˆλŠ” λ””λ ‰ν† λ¦¬μ—μ„œλ§Œ μ‹€ν–‰νŒŒμΌμ„ μ°ΎμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ PATHλΌλŠ” ν™˜κ²½λ³€μˆ˜μ— ν˜„μž¬λ””λ ‰ν† λ¦¬λ₯Ό μ˜λ―Έν•˜λŠ” λ„νŠΈ 문자(.)κ°€ λ“€μ–΄μžˆμ§€ μ•Šλ‹€λ©΄ ν˜„μž¬ λ””λ ‰ν† λ¦¬μ˜ μ‹€ν–‰νŒŒμΌμ€ μ ˆλŒ€ μ‹€ν–‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ²Œλ‹€κ°€ ν˜„μž¬ 디렉토리λ₯Ό PATH ν™˜κ²½ λ³€μˆ˜μ— λ„£μ–΄μ€€λ‹€ 할지라도 λ„μŠ€μ²˜λŸΌ ν˜„μž¬ 디렉토리λ₯Ό λ¨Όμ € μ°ΎλŠ” 일이 μ—†κ³  PATH에 μ§€μ •ν•œ μˆœμ„œλŒ€λ‘œ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

쀑간에 -o에 λŒ€ν•΄μ„œ λ³Ό 수 μžˆμ—ˆλŠ”λ°μš” μ΄λŠ” 좜λ ₯ 파일λͺ…을 μ •ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€. μΌλ°˜μ μœΌλ‘œλŠ” 파일λͺ… κ·ΈλŒ€λ‘œμ—λ‹€κ°€ .out으둜 좜λ ₯ νŒŒμΌμ΄λΌλŠ” 것을 μ˜λ―Έν•˜λ©° 이 μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  gcc hello.cλ₯Ό μž…λ ₯ν–ˆμ„ λ•ŒλŠ” a.out으둜 좜λ ₯ 파일이 μƒμ„±λ©λ‹ˆλ‹€.

이외에도 -c, -l, -L μ˜΅μ…˜μ΄ μ‘΄μž¬ν•˜λŠ”λ°μš”. μ΄λŠ” 쒀더 μ‹¬ν™”λœ κ²ƒμœΌλ‘œ 이번 μ±•ν„°μ—μ„œλŠ” 닀루지 μ•Šλ„λ‘ ν•©λ‹ˆλ‹€! λ‚˜μ€‘μ— 심화λ₯Ό ν•˜κ²Œλœλ‹€λ©° λ°°μš°λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€!!

### κ°„λ‹¨ν•˜κ²Œ c++둜 Hello World 좜λ ₯ν•˜κΈ°

``` c++
#include <iostream>

int main(Void) {
cout << "Hello World!";
return 0;
}
```
c++μ—λŠ” stdio.h와 λΉ„μŠ·ν•˜κ²Œ iostream헀더가 μž…μΆœλ ₯ 해더와 λ‹€λ₯Έ ν•¨μˆ˜λ“€μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€. printf와 λΉ„μŠ·ν•œ 것은 cout이며 μ΄μ™Έμ—λŠ” cμ—μ„œ 배운 것과 κ°™μŠ΅λ‹ˆλ‹€
이λ₯Ό 컴파일 ν•΄λ΄…μ‹œλ‹€
g++ hello.cpp -o hello.out
c++의 ν™•μž₯μžλŠ” cppμ΄λ―€λ‘œ 이λ₯Ό μ‚¬μš©ν•΄μ£Όκ³  c++μ΄λ―€λ‘œ g++을 ν†΅ν•˜μ—¬ μ»΄νŒŒμΌμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€!!
__c와 c++ μ–Έμ–΄μ—μ„œμ˜ Hello Worldλ₯Ό 좜λ ₯ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μ•˜μœΌλ©° 이제 λ‹€μŒμ±•ν„°λ‘œ λ„˜μ–΄κ°€λ΄…μ‹œλ‹€!!__

0 comments on commit cecc968

Please sign in to comment.