๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Graphic

์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ์Šค::opengl ์„ค์น˜ ๋ฐ c++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋™์ž‘ ์›๋ฆฌ

by ๋„์บ๋ฆฌ๐Ÿฑ 2020. 7. 11.
๋ฐ˜์‘ํ˜•

intro

↓ ํ˜„์žฌ ๋”ฐ๋ผ๊ฐ€๊ณ  ์žˆ๋Š” ์ฑ…์ธ Opengl๋กœ ๋ฐฐ์šฐ๋Š” ์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ์Šค ์ฑ…์—์„œ ์‹ค์Šต ์˜ˆ์ œ๋“ค๋กœ๋Š” GLUT๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์„ค์น˜ ์ค‘ ๋‚˜๋Š” ์—ฌ๋Ÿฌ ๋ธ”๋กœ๊ทธ์™€ ์œ ํˆฌ๋ธŒ๋ฅผ ์ฐธ๊ณ ํ•˜๋˜ ์ค‘ ๋‚˜๋Š” Visual Studio์— GLUT๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ , GLFW ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•จ์ˆ˜๋“ค์ด ๋‹ค๋ฅธ๊ฑธ ๋งค๋ฒˆ ๋ฐ”๊ฟ”์„œ ๋‚ด๊ฐ€ ํ•˜๊ธฐ๋Š” ๋œ์ปฅ ๊ฒ์ด ๋‚˜์„œ GLUT๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๊ผญ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ์„ค์ •์„ ํ•ด์•ผ๊ฒ ๋‹ค ํ•˜๋˜ ์ค‘, ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ์ฐจ์ด๊ฐ€ ๋ญ”์ง€, (์ฑ…์—๋Š” GLFW ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์ผ์ฒด ์—†์—ˆ๋‹ค.) ์•Œ์•„๋ณด๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„ ์กฐ์‚ฌํ•˜๋˜ ์ค‘ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.  

https://toughrogrammer.tistory.com/206

์ด ๋ธ”๋กœ๊ทธ์—์„œ ํ•˜๋Š” ๋ง์„ ์•ฝ๊ฐ„ ์š”์•ฝํ•˜์ž๋ฉด, ์‚ฌ๋žŒ๋“ค์ด GLUT์™€ GLFW๋ฅผ ๊ฐ™์ด ์“ด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ ์™ธ์—๋„ ๊ผญ ์ฝ์–ด ๋ณผ ๊ฒƒ๋“ค์ด ๋งŽ๋‹ค. 


↓์„ค์น˜ ๋„์›€ ๋ฐ›์€ ์œ ํˆฌ๋ธŒ ๋งํฌ, ๋ธ”๋กœ๊ทธ ๋งํฌ

youtu.be/OR4fNpBjmq8?list=PLlrATfBNZ98foTJPJ_Ev03o2oq3-GGOS2

https://blog.amaorche.com/20

 

OpenGL freeglut Visual Studio ์„ค์น˜ ๋ฐฉ๋ฒ•

C++์—์„œ ์ , ์„  ๋ฉด ๋“ฑ ๋„ํ˜•์„ ๊ทธ๋ฆฌ๊ฑฐ๋‚˜, ์ฐฝ ์กฐ์ ˆ, ํ‚ค๋ณด๋“œ๋‚˜ ๋งˆ์šฐ์Šค ์ž…๋ ฅ๋“ฑ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ GLUT(OpenGL Utility Toolkit) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ GLUT๋Š” ์˜คํ”ˆ์†Œ์Šค๋„ ์•„๋‹ˆ๊ณ , ์˜›๋‚ ์— ์—…๋ฐ์ดํŠธ๊ฐ€ ์ค‘๋‹จ๏ฟฝ๏ฟฝ

blog.amaorche.com

์œ ํˆฌ๋ธŒ์—์„œ๋Š” GLFW ์„ค์น˜ ๋ฐฉ๋ฒ•๋ฐ ์•ˆ๋‚ด๋ฅผ ํ•ด์ค€๋‹ค. ๋ธ”๋กœ๊ทธ๋Š” GLUT ์„ค์น˜ ๋ฐฉ๋ฒ•์ธ๋ฐ, ๋ธ”๋กœ๊ทธ ๊ทธ๋Œ€๋กœ๊ฐ€ ์•„๋‹ˆ๋ผ ์œ ํˆฌ๋ธŒ ๋”ฐ๋ผํ•˜๊ณ  GLFW ์„ค์น˜ ํ›„ , ๊ทธ๋Œ€๋กœ GLUT์—๋„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค. Visual Studio์—์„œ ์ถ”๊ฐ€ ์ข…์†์„ฑ, ๋ง์ปค ๋“ฑ ์„ค์ • ์‹œ์— ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์†”๋ฃจ์…˜๋””๋ ‰ํ„ฐ๋ฆฌ ์•„๋ž˜~์ด๋ ‡๊ฒŒ ์ž˜ ์„ค์ •ํ•ด ๋†“์•„ํ– ํ•˜๋Š”๋ฐ ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šฐ๋‹ˆ๊นŒ!

 

(+ ๋ช‡๋ฒˆ์ด๊ณ  ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ๋ž‘ ์œ ํˆฌ๋ธŒ ์ฐธ๊ณ  ํ•˜๋‹ค๊ฐ€ ์•ˆ๋ฌ๋Š”๋ฐ ๋‚˜๋Š” ์œ„์— ๊ฒƒ์„ ๋ณด๊ณ  ์ž˜ ํ–ˆ๋‹ค! ๊ทธ๋ž˜์„œ ์ผ๋‹จ ์œ„์— ์œ ํˆฌ๋ธŒ๋ฅผ ์ถ”์ฒœ! )


 

 c++ ๋ง์ปค(Linker) ๋™์ž‘ ์›๋ฆฌ                         //F5 ๋˜๋Š” ๋นŒ๋“œ๋˜๋Š” ๋Ÿฐ ํ”„๋กœ์ ํŠธ → ์ปดํŒŒ์ผ +๋งํฌ

https://www.youtube.com/watch?v=H4s55GgAg0I

Linking์ด ๋ญ˜๊นŒ? c++์—์„œ Linker๋Š” ์–ด๋–ค ์ผ์„ ํ• ๊นŒ?

Linking์€ source c++ ํŒŒ์ผ์—์„œ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๊ฐ€๋Š” ํ”„๋กœ์„ธ์Šค๋‹ค. 

์ปดํŒŒ์ผ ๋˜๋ฉด Linking ์ด๋ผ๋Š” ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค. ๋งํ‚น์˜ ์ฃผ์•ˆ์„ ๋‘๋Š” ๊ฒƒ์€ ๊ฐ๊ฐ์˜ Symbol , function์ด ์–ด๋”” ์—์žˆ๋Š”์ง€ ์ฐพ๋Š” ๊ฒƒ๊ณผ, ๊ทธ๊ฒƒ๋“ค์„ ํ•จ๊ป˜ link ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 

๊ฐœ๋ณ„์˜ ํŒŒ์ผ๋“ค์€ ๋…๋ฆฝ์ ์ธ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ(==translation unit) ๋กœ ์ปดํŒŒ์ผ ๋œ๋‹ค.(ex: where the main fuction is ?)

 

properties์—์„œ entrypoint ๋ถ€๋ถ„๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต์€ mainํ•จ์ˆ˜๊ฐ€ entry point๊ฐ€ ๋˜์ง€๋งŒ ๊ผญ ๊ทธ๋Ÿด ํ•„์š”๋Š” ์—†๋‹ค.

์˜ค๋ฅ˜์ค‘ : unresolved external symbol =>๋ง์ปค๊ฐ€ ํ•„์š”ํ•œ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ ๋œจ๋Š” ์˜ค๋ฅ˜๋‹ค.

 

๊ฐ™์€ ํ•จ์ˆ˜ ๋ช…์ด๋‚˜ ๋ณ€์ˆ˜ ๋ช…์ด ์žˆ์„ ์‹œ์—๋„, ๋ง์ปค๋Š” ๋ญ˜ ๋งํฌํ•ด์•ผํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์œผ๋‹ˆ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

static์„ ๋ถ™์ธ ํ•จ์ˆ˜๋ช…์€ internal์—๋งŒ ์œ„์น˜. ๊ทธ๋ž˜์„œ ๊ทธ ํŒŒ์ผ ๋ฐ–์˜ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์—์„œ๋Š” ๋ณด์ด์ง€ ์•Š์„ ๊ฒƒ์ž„.

// ์ •๋ฆฌ: ์ปดํŒŒ์ผ ํ›„ ๋งํฌํ•˜๋Š” ๊ฒƒ์ด๊ณ , entry point๊ฐ€ ์–ด๋”˜์ง€ ๋“ฑ์„ ์—ฐ๊ฒฐ์ฃผ๋Š” ๊ฒƒ.  ์ฃผ๋กœ LINK ์˜ค๋ฅ˜

 

 c++ ์ปดํŒŒ์ผ๋Ÿฌ(Compiler) ๋™์ž‘ ์›๋ฆฌ                       // F7 ๋˜๋Š” ์ปดํŒŒ์ผ ๋ฒ„ํŠผ๋งŒ ๋ˆ„๋ฅผ ์‹œ → ๋‹จ์ˆœํžˆ ์ปดํŒŒ์ผ๋งŒ ๋˜๋Š” ๊ฒƒ (๋งํ‚น ์•ˆ๋จ)

https://www.youtube.com/watch?v=3tIqpEmWMLI

Compiler๊ฐ€ ๋ญ˜๊นŒ? c++ ์—์„œ Compiler๋Š” ์–ด๋–ค ์ผ์„ ํ• ๊นŒ? ์‹ค์ œ๋กœ c++ compiler๊ฐ€ ์–ด๋–ค ๊ฒƒ์—  ์ฑ…์ž„์„ ์งˆ๊นŒ?

์šฐ๋ฆฌ๋Š” c++ ์ฝ”๋“œ๋ฅผ ํ…์ŠคํŠธ๋กœ ์ž‘์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ํ…์ŠคํŠธ๋ฅผ ์ปดํ“จํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ์‹คํ–‰ํŒŒ์ผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. 

 

์—ฌ๊ธฐ์„œ " ํ…์ŠคํŠธ ํŒŒ์ผ → ์‹คํ–‰๊ฐ€๋Šฅํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ " ์ด๋ ‡๊ฒŒ ์˜ฎ๊ฒจ์ ธ์•ผ ํ•  ๋•Œ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘ ๊ฐ€์ง€ ๋ฉ”์ธ ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค. ์ฒซ๋ฒˆ์งธ๋Š” ์ปดํŒŒ์ผ๋ง ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์ด๊ณ , ๋˜ ํ•˜๋‚˜๋Š” ๋งํ‚น ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

 

ํ…์ŠคํŠธ ํŒŒ์ผ์„ intermediate format (==object file์ด๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค. )์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ด์•ผ ํ•œ๋‹ค. ์ด ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์ด ๋ง์ปค์—๊ฒŒ๋„ ํŒจ์Šค ๋œ๋‹ค.

 

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด "objectfile"์„ ๋งŒ๋“ค๋•Œ ๋ช‡๊นŒ์ง€ ์ผ์„ ํ•œ๋‹ค. ์ฒซ๋ฒˆ์งธ๋กœ ์šฐ๋ฆฌ์ฝ”๋“œ๋ฅผ Pre-processํ•œ๋‹ค. ์ด ๋œป์€ ์–ด๋–ค preprocessor statements get evaluated then and there(์—ฌ๊ธฐ์ €๊ธฐ์„œ). == abstract syntax tree๋ฅผ ๋งŒ๋“ ๋‹ค. ์‹ค์ œ๋กœ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์‹œ์ž‘ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์ฝ”๋“œ๋Š” ์‹ค์ œ ๊ธฐ๊ณ„ ์ฝ”๋“œ ์ด๋‹ค. ์‹ค์ œ ๊ธฐ๊ณ„ ์ฝ”๋“œ๋ผ๋Š” ๊ฑด ์šฐ๋ฆฌ CPU๊ฐ€ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ. 

c++(.cpp) → translation unit →object file(.obj)

๊ทธ ์ „์— ์–ธ๊ธ‰ํ•œ pre-processing? pre-processing ๋„์ค‘์—” ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ go through all of our pre-processing statements and evaluate them. pre-processing ์˜ˆ๋กœ , /include ๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜?

 

preoprocessor์€ ์ด ํŒŒ์ผ์„ ์—ด๊ณ , ๋ชจ๋“  contents๋ฅผ ์ฝ๊ณ , ํŒŒ์ผ์— ๋ณต์‚ฌ ํ•ด ๋„ฃ๋Š”๋‹ค. ์†์„ฑ์—์„œ c++ ๋ถ€๋ถ„์—์„œ preprocessor๋ถ€๋ถ„ ํ™œ์„ฑํ™” ํ•˜๋ฉด .i ํŒŒ์ผ์ด ์ƒ๊ธฐ๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. #define, #if - #endif,  #include <iostream> 

objectํŒŒ์ผ์ด ์šฉ๋Ÿ‰์ด ํฐ ์ด์œ ๋ฅผ ์—ฌ๊ธฐ์„œ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์™œ๋ƒ๋ฉด object ํŒŒ์ผ์€ iostream๊ฐ™์€ 50000์ค„์˜ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๊ฒŒ ๋˜๋‹ˆ๊นŒ.

 

์ด์ œ ์ดํ›„์— machine code๋กœ ๋ฐ”๊พธ๋Š” ์ž‘์—….

// ์ •๋ฆฌ :  ๋ฒˆ์—ญํ•ด์„œ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ ์ž์ฒด์˜ ํ–‰์œ„. ์‹ ํƒ์Šค ์—๋Ÿฌ๋Š” ์žก๊ฒ ์ง€๋งŒ ๋งํ‚น์—๋Ÿฌ๋Š” ๋‹น์—ฐํžˆ ๋ชป์žก์Œ , ์ฃผ๋กœ C๋กœ ์‹œ์ž‘ํ•˜๋Š” ์˜ค๋ฅ˜

 

 

>> ์ปดํŒŒ์ผ๋Ÿฌ ์—๋Ÿฌ์ธ์ง€, ๋งํฌ ์—๋Ÿฌ์ธ์ง€ ๊ตฌ๋ถ„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ํ•ด๊ฒฐ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผํ•œ๋‹ค. 

 

 

 c++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋™์ž‘ ์›๋ฆฌ(๋ถ€์ œ : C++์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ )

์™ธ๋ถ€๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์–ด๋–ป๊ฒŒ ํ”„๋กœ์ ํŠธ์—์„œ ์“ธ ์ˆ˜ ์žˆ๋‚˜?

๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ์—ฐ๊ฒฐํ•  ์‹ค์ œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๋‹ค์šด๋กœ๋“œ์‹œ 64bit๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•ด์•ผํ• ๊นŒ? ์ด๊ฒƒ์€ ๋‚ด ์ปดํ“จํ„ฐ ์‚ฌ์–‘์ด ์•„๋‹ˆ๋ผ, ๋‚ด application target์— ๋งž์ถฐ์•ผํ•œ๋‹ค. 

๋ณดํ†ต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋‹ค์šด ๋ฐ›์œผ๋ฉด ์ „ํ˜•์ ์œผ๋กœ ๊ฐ–์ถ”์–ด์ง„ ๊ตฌ์„ฑ์ด ์žˆ๋‹ค.

 include / ( lib-blabla2017 / lib-blabla2019)

 

๋ฐ”๋กœ include ์™€ library ๋””๋ ‰ํ„ฐ๋ฆฌ

include ๋””๋ ‰ํ„ฐ๋ฆฌ ??  ํ—ค๋” ํŒŒ์ผ๋“ค(we need to use - for using function that are in pre-built binaries)

lib ๋””๋ ‰ํ„ฐ๋ฆฌ ?? pre-built binaries๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.

 

dynamic ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ? 

static ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ?

๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์œ„์— ๋‘๊ฐœ๋กœ ๋‚˜๋‰˜์–ด์ง€์ง€๋Š” ์•Š์ง€๋งŒ, ๋ณดํ†ต์€~

์šฐ๋ฆฌ๋Š” ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ๋งํฌ๋ฅผ staticํ•˜๊ฒŒ ํ• ์ง€, dynamicํ•˜๊ฒŒ ํ• ์ง€.

 

static linking์ด๋ž€ ์‹คํ–‰๊ฐ€๋Šฅํ•œ ํŒŒ์ผ ์•ˆ์— ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, dllํŒŒ์ผ์ด๋‚˜ ์šด์˜์ฒด์ œ์šฉ ์‹คํ–‰ ํŒŒ์ผ์ด๋‹ค.

 

dynamic library๋ž€ ๋Ÿฐํƒ€์ž„์ค‘ ๋งํฌ ๋œ๋‹ค. so you still do have some kinde of linkage you can choose to alert a dynamic library kind of just on the fly literally there's a function called load library which you can use in the Windows API as an example and that will load you like your dynamic library and you can pull fuction pointers out of data ~ that way, you can also have a kind of at the application launch it loads yout .DLL file which is your dynamic link library. 

.dll - ๋‹ค์ด๋‚ด๋ฏน ๋งํ‚น ์‹œ ์“ฐ์ด๋Š”

 

properties ->Linker->General

properties ->Linker->input

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€