gcc °ÁÂ
¸í·ÉÇà »óÅ¿¡¼ ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇغ¾½Ã´Ù. ¿©·¯ºÐÀÌ »ç¿ëÇÏ°°°í ÀÖ´Â gcc ¹öÀüÀº ¾Ë¾ÆµÎ°í ½ÃÀÛÇϼž߰ÚÁÒ?
[yong@redyong yong]$ gcc -v Reading specs from /usr/lib/gcc-lib/i386-linux/2.7.2.1/specs gcc version 2.7.2.1 [yong@redyong yong]$
gcc -v À̶ó°í ÀÔ·ÂÇϴϱî ``Reading specs from..'' ÀÌ¶ó°°°í ¸»ÇÏ¸é¼ ±× °á°ú°ªÀ» ``gcc version 2.7.2.1''À̶ó°í ¸»ÇØÁÖ°í ÀÖ½À´Ï´Ù. ÀÚ, ¾îµð¼ gcc ¿¡ ´ëÇÑ Á¤º¸¸¦ Àоî¿À´ÂÁö º¾½Ã´Ù.
/usr/lib/gcc-lib/i386-linux/2.7.2.1/specs
gcc ¸¦ ¿©·¯ºÐÀÌ ¼Ò½º¸¦ °¡Á®´Ù ¼Õ¼ö ¼³Ä¡Çغ¸½Å ÀûÀº ¾øÀ» °ÍÀÔ´Ï´Ù. º¸ÅëÀº ¹ÙÀ̳ʸ® ÆÐÅ°Áö·Î µÈ °ÍÀ» °¡Á®´Ù ¼³Ä¡ÇÏÁö¿ä. ³ªÁß¿¡ Á¤¸» ÈÞÀÏ¿¡ ³Ê¹« ½É½ÉÇÏ´Ù ½ÍÀ¸¸é gcc ÀÇ ¼Ò½º¸¦ °¡Á®¿Í¼ ÄÄÆÄÀÏÇغ¸½Ê½Ã¿ä. Âü, Àç¹ÌÀÖ´Â °æÇèÀÌ µÉ °ÍÀÔ´Ï´Ù. ÀÌ¹Ì ¿©·¯ºÐÀÌ °®°í ÀÖ´Â gcc ¸¦ °¡Áö°í »õ·Î¿î gcc ¸¦ ÄÄÆÄÀÏÇÏ¿© »ç¿ëÇÕ´Ï´Ù. C ÄÄÆÄÀÏ·¯¸¦ °¡Áö°í »õ ¹öÀüÀÇ C ÄÄÆÄÀÏ·¯¸¦ ÄÄÆÄÀÏÇÏ¿© »ç¿ëÇÑ´Ù! ÀÌ·± Àç¹ÌÀÖ´Â °æÇèÀ» ¶Ç ¾îµð¼ Çغ¸°Ú½À´Ï±î?
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 ¹öÀü >
º¸Åë ¿ì¸®´Â ¸®´ª½º¸¦ i386 ( ÀÎÅÚ È¯°æ )¿¡¼ »ç¿ëÇÏ°í ÀÖÀ¸¹Ç·Î ´ÙÀ½°ú °°ÀÌ ³ªÅ¸³¯ °ÍÀÔ´Ï´Ù.
/usr/lib/gcc-lib/i386-linux/2.7.2.1
( i386-linux, i486-linux, i586-linux ´Â °¢±â ´Ù¸¦ ¼ö ÀÖ½À´Ï´Ù. ÇÏÁö¸¸ »ó°ü¾ø´Â ³»¿ëÀÔ´Ï´Ù. ¹ÌÄ£ ô ÇÏ°í ´Ù¸¥ À̸§À» ºÎ¿©ÇÒ ¼öµµ ÀÖ½À´Ï´Ù. )
±×·³ °è¼Ó Çؼ /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++ ÄÄÆÄÀÏ·¯( Á¤È®È÷´Â C++ ÄÄÆÄÀÏ·¯ ÇÁ·ÐÆ® ¿£µå )¿¡ ´ëÇÑ ÆÐÅ°Áö´Â ´ÙÀ½°ú °°½À´Ï´Ù.
/usr/bin/c++ ---------------------------> g++ ¿¡ ´ëÇÑ ¸µÅ©¿¡ ºÒ°úÇÔ /usr/bin/g++ /usr/lib/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
±¸¼º¿ä¼Ò°¡ ¾î¶² °ÍÀÎÁö ¾Æ¼ÌÀ¸´Ï Á» µµ¿òÀÌ µÇ¼ÌÀ» °Ì´Ï´Ù.
hello.c ¶ó´Â Áö±ßÁö±ßÇÑ ¼Ò½º Çϳª¸¦ ±âÁØÀ¸·Î ¼³¸íÇÕ´Ï´Ù ^^
#include <stdio.h> int main ( void ) { (void) printf ( "Hello, Linux Girls! =)\n" ); return 0; }
Âü°í·Î Á¦ÀÏ °£´ÜÇÑ ¼Ò½º´Â ´ÙÀ½°ú °°Àº °ÍÀÔ´Ï´Ù. ^^
main () {}
ÄÄÆÄÀÏÀ» Çغ¸°Ú½À´Ï´Ù! $ ´Â ÇÁ·ÒÇÁÆ®ÀÌÁö ÀÔ·ÂÇÏ´Â °ÍÀÌ ¾Æ´Ñ °Í ¾Æ½ÃÁÒ?
$ gcc hello.c $
¹«¼Ò½ÄÀÌ Èñ¼Ò½ÄÀ̶ó... gcc <C¼Ò½º ÈÀϸí> ÀÌ·¸°Ô ½ÇÇàÇÏ°í ³ª¼ ¾Æ¹«·± ¸Þ½ÃÁöµµ ³ª¿ÀÁö ¾Ê°í ´ÙÀ½ ÁÙ¿¡ ÇÁ·ÒÇÁÆ®¸¸ ´Þ¶û ¶³¾îÁö¸é ±×°ÍÀÌ ¹Ù·Î ÄÄÆÄÀÏ ¼º°øÀÔ´Ï´Ù.
¿©·¯ºÐÀº ¹«½ÉÄÚ ´ÙÀ½°ú °°ÀÌ °á°ú ÇÁ·Î±×·¥À» ½ÇÇà½ÃÅ°·Á ÇÒ °ÍÀÔ´Ï´Ù.
$ hello bash: hello: command not found $
¿¹. ¶¯ÀÔ´Ï´Ù. ^^
¿©·¯ºÐÀº ´ÙÀ½°ú °°ÀÌ ½ÇÇà½ÃÄÑ¾ß ÇÕ´Ï´Ù.
$ ./a.out
¸Ç ¾ÕÀÇ µµÆ® ¹®ÀÚ(.)´Â ÇöÀç µð·ºÅ丮¸¦ ÀǹÌÇÕ´Ï´Ù. ±× ´ÙÀ½ µð·ºÅ丮 ±¸ºÐ ¹®ÀÚ ½½·¡½¬(/)¸¦ ¾²°í À¯´Ð½º C ¿¡¼ ``¾à¼ÓÇÑ'' C ÄÄÆÄÀÏ·¯ÀÇ Ãâ·Â °á°ú ¹ÙÀ̳ʸ® ÈÀÏÀÎ a.out À» ½áÁÝ´Ï´Ù.
ÀÌ·¯ÇÑ ½À°üÀº ¾ÆÁÖ Áß¿äÇÕ´Ï´Ù. ¿©·¯ºÐÀÌ ÇöÀç µð·ºÅ丮¿¡ ¾î¶² ½ÇÇà ÈÀÏÀ» ¸¸µé°í ³ª¼ Å×½ºÆ®¸¦ ÇØ º¸·Á°í ÇÑ´Ù¸é ²À ./<½ÇÇà ÈÀϸí> À̶ó°í Àû¾îÁÝ´Ï´Ù.
À¯´Ð½º´Â ±âº»ÀûÀ¸·Î PATH ¶ó´Â ȯ°æº¯¼ö¿¡ ÀÖ´Â µð·ºÅ丮¿¡¼¸¸ ½ÇÇàÈÀÏÀ» ãÀ» »ÓÀÔ´Ï´Ù. ¸¸¾à PATH ¶ó´Â ȯ°æº¯¼ö¿¡ ÇöÀç µð·ºÅ丮¸¦ ÀǹÌÇÏ´Â µµÆ® ¹®ÀÚ(.)°¡ µé¾îÀÖÁö ¾ÊÀ¸¸é ÇöÀç µð·ºÅ丮ÀÇ ½ÇÇàÈÀÏÀº Àý´ë ½ÇÇàµÇÁö ¾Ê½À´Ï´Ù. °Ô´Ù°¡ ÇöÀç µð·ºÅ丮¸¦ PATH ȯ°æ º¯¼ö¿¡ ³Ö¾îÁØ´Ù ÇÒ Áö¶óµµ µµ½ºÃ³···³ ÇöÀç µð·ºÅ丮¸¦ ¸ÕÀú ã´Â´ÙµçÁö ÇÏ´Â ÀÏÀº ¾ø½À´Ï´Ù. ¿À·ÎÁö PATH ¿¡ ÁöÁ¤ÇÑ ¼ø¼´ë·Î ¼öÇàÇÕ´Ï´Ù.
½ÇÇà ¹ÙÀ̳ʸ®¸íÀÌ °è¼Ó a.out À¸·Î ³ª¿À¸é Á» °ï¶õÇÏÁÒ. ¹¹ ¹°·Ð mv ¸í·ÉÀ¸·Î a.out ÀÇ À̸§À» ¹Ù²Ù¸é µÇÁö¸¸¼µµ...
-o ¿É¼Ç( ¼Ò¹®ÀÚ o ÀÓ! )Àº Ãâ·Â(output) ÈÀϸíÀ» Á¤ÇÏ´Â ¿É¼ÇÀÔ´Ï´Ù. À§¿¡¼ ¿ì¸®´Â hello.c ¶ó´Â ¼Ò½º¸¦ °¡Áö°í ÀϹÝÀûÀ¸·Î hello ¶ó´Â À̸§ÀÇ ½ÇÇàÈÀÏÀ» ¸¸µé°í ½Í¾îÇÒ °ÍÀÔ´Ï´Ù.
$ gcc -o hello hello.c ^^^^^^^^
¶Ç´Â ´ÙÀ½°ú °°ÀÌ ¼ø¼¸¦ ¹Ù²ãµµ ¹«¹æÇÕ´Ï´Ù.
$ gcc hello.c -o hello ^^^^^^^^
¿ö³« À¯´Ð½º ÂÊÀº ¸í·ÉÇà ¹æ½ÄÀÌ ÀüÅëÀûÀ¸·Î ÁÖµÈ ¹æ½ÄÀ̶ó ¸í·ÉÇà¿¡¼ ÇÏ´Â ÀÏÀº ¶Ù¾î³³´Ï´Ù.
´ç¿¬È÷ ½ÇÇàÀ» ÇÏ·Á¸é ./hello ¶ó°í ÇÏ¼Å¾ß ÇÕ´Ï´Ù. °á°ú´Â ´ÙÀ½Ã³·³ ³ª¿À°ÚÁö¿ä?
$ ./hello Hello, Linux Girls! =) $
Á¦ÀÏ ¾ÈÁÁÀº ½À°ü Áß Çϳª°¡ ¹Ù·Î Å×½ºÆ®¿ëÀ¸·Î ¸¸µç ¼Ò½º¶ó°í ´ÙÀ½Ã³·³ ÇÏ´Â °ÍÀÔ´Ï´Ù.
$ gcc -o test test.c $ test $
¹®Á¦¸¦ ¾Ë¾Æ³»±â À§ÇÏ¿© À§¿¡¼ ÀÛ¼ºÇÑ hello.c ¸¦ ÄÄÆÄÀÏ/¸µÅ©Çغ¾½Ã´Ù.
$ gcc -o test hello.c $ test $
¿øÇÏ´Â ¹®ÀÚ¿ÀÌ Ãâ·ÂµÇÁö ¾Ê¾Ò½À´Ï´Ù. -.-
$ ./test Hello, Linux Girls! =) $
¾î¶² ÀÌÀ¯·Î ¿À·ÎÁö ÄÄÆÄÀÏ(compile) ÀÛ¾÷¸¸ ÇÏ°í ½ÍÀº °æ¿ì°¡ ÀÖ½À´Ï´Ù. ±×·² ¶§´Â ´ÙÀ½°ú °°ÀÌ ÇÕ´Ï´Ù.
$ gcc -c hello.c $
±× °á°ú ¸¸µé¾îÁö´Â ÈÀÏÀº ÀüÅëÀûÀ¸·Î hello.c ¿¡¼ .c ºÎºÐÀ» ¶¼¾î³»°í .o ¸¦ ºÙÀÎ ÈÀÏÀÔ´Ï´Ù. ¿ÀºêÁ§Æ® ÈÀÏ, ¸ñÀû ÈÀÏÀ̶ó°í ÇÏÁö¿ä.
hello.o ¶ó´Â ÈÀÏÀÌ ¸¸µé¾îÁý´Ï´Ù.
¿©·¯ºÐÀº C ¾ð¾î·Î Á¶±ÝÀÌ¶óµµ º¹ÀâÇÑ ÇÁ·Î±×·¥À» ¸¸µé±â ½ÃÀÛÇÏ¸é ¿©·¯ °³ÀÇ ¼Ò½º·Î ³ª´©¾î¼ Àüü ÇÁ·Î±×·¥À» Â¥°Ô µË´Ï´Ù. ±×·² ¶§´Â °¢ ¼Ò½º°¡ Àüü ±â´É¿¡ ±â¿©Çϴ ƯÁ¤ ±â´ÉÀÇ ÇÔ¼öµéÀ» °¡Áö°Ô µÇ°í ¿À·ÎÁö ÇÑ ³à¼®¸¸ main ÇÔ¼ö¸¦ °¡Áý´Ï´Ù.
¸¸¾à ¾î¶² ÇÁ·Î±×·¥ÀÌ foo.c, bar.c ÀÌ·¸°Ô µÎ °³ÀÇ ¼Ò½º·Î ÀÌ·ç¾îÁ® ÀÖ´Ù°í ÇսôÙ. ÀÌ·² ¶§´Â ´ÙÀ½°ú °°ÀÌ ÇÏ´Â °ÍÀÌ °¡´ÉÇÕ´Ï´Ù.
$ gcc -o baz foo.c bar.c $ ./baz
$ gcc -c foo.c $ gcc -c bar.c ¶Ç´Â $ gcc -c foo.c bar.c $ gcc -o baz foo.o bar.o ^^^^^^^^^^^ $ ./baz
À§¿¡¼ º¸¸é "¾Æ´Ï! C ÄÄÆÄÀÏ·¯¿¡ .c Áï ¼Ò½º ÈÀÏÀÌ ¾Æ´Ñ ¿ÀºêÁ§Æ® ÈÀϵµ ¸· ½áÁÖ³ª?"¶ó´Â »ý°¢À» ÇÏ½Ã°Ô µÉ °Ì´Ï´Ù.
±×·¸½À´Ï´Ù! ¿Ö³Ä? gcc ´Â Á¤È®È÷ ¸»Çؼ C ÄÄÆÄÀÏ·¯°¡ ¾Æ´Õ´Ï´Ù. gcc ¶ó´Â ½ÇÇà ÈÀÏ ÀÚü´Â "C ÄÄÆÄÀÏ·¯¸¦ µ¹¸®´Â ³à¼®"ÀÔ´Ï´Ù.
´õ¿í ´õ Á¤È®È÷ ¸»Çغ¸°Ú½À´Ï´Ù.
C ¾ð¾î´Â ±âº»ÀûÀ¸·Î µÎ °¡Áö °úÁ¤À» °ÅÃľ߸¸ ½ÇÇàÈÀÏÀ» ¸¸µé¾î³À´Ï´Ù.
1. °úÁ¤À» ½ÇÁ¦·Î ¸Ã´Â °ÍÀº cc1 À̶ó´Â ³à¼®ÀÌ°í 2. °úÁ¤À» ¸Ã´Â °ÍÀº ld ¶ó´Â ¸µÄ¿(linker)ÀÔ´Ï´Ù.
gcc ´Â »ó´çÈ÷ Æí¸®ÇÑ µµ±¸·Î¼ .c, .o µîÀÇ ÈÀÏ¸í ²¿¸®¸»À» º¸°í ÀûÀýÇÏ°Ô C ÄÄÆÄÀÏ·¯¿Í ¸µÄ¿¸¦ ºÒ·¯´Ù°¡ ¿øÇÏ´Â ½ÇÇàÈÀÏÀ» ¸¸µé¾îÁÝ´Ï´Ù. gcc ´Â "ÄÄÆÄÀÏ·¯¿Í ¸µÄ¿¸¦ ºÒ·¯ÁÖ´Â ´ë¸®ÀÎ"ÀÔ´Ï´Ù.
hello.c ¸¦ ±¦È÷ ¾î·Æ°Ô ÄÄÆÄÀÏ/¸µÅ©Çغ¾½Ã´Ù ^^
$ gcc -c hello.c ^^^^^^^ $ gcc -o hello hello.o ^^^^^^^
gcc °¡ ¾ó¸¶³ª ¶È¶ÈÇÇÇÑ ³ðÀÎÁö ¾Ë¾Æº¸ÁÒ.
$ gcc -c hello.o
ÀÌ°Ô ¹«½¼ Àǹ̰¡ ÀÖ°Ú½À´Ï±î? ^^
gcc: hello.o: linker input file unused since linking not done
À§¿Í °°ÀÌ ºÒÆòÇÕ´Ï´Ù. ¸µÅ© °úÁ¤À» ¼öÇàÇÏÁö ¾ÊÀ¸¹Ç·Î ¸µÄ¿¿¡ ´ëÇÑ ÀÔ·Â ÈÀÏÀÎ hello.o ¸¦ »ç¿ëÇÏÁö ¾Ê¾Ò´Ù!
#include ¹®Àå¿¡¼ ÁöÁ¤ÇÑ Çì´õ ÈÀÏÀÌ µé¾îÀÖ´Â °÷À» Á¤ÇÏ´Â ¿É¼ÇÀÔ´Ï´Ù. ¾ÆÁÖ ¸¹ÀÌ »ç¿ëµÇ´Â ¿É¼Ç Áß ÇϳªÀÔ´Ï´Ù.
#include <stdio.h> #include "my_header.h"
ÀüÀÚ( <> ¹®ÀÚ¸¦ ¾´ °æ¿ì )´Â ½Ã½ºÅÛ Ç¥ÁØ Çì´õ µð·ºÅ丮ÀÎ /usr/include¸¦ ±âÁØÀ¸·Î ÈÀÏÀ» ã¾Æ¼ Æ÷ÇÔ½Ãŵ´Ï´Ù. Ç¥ÁØ µð·ºÅ丮ÀÌÁö¿ä.
ÈÄÀÚ( "" ¹®ÀÚ¸¦ ¾´ °æ¿ì )´Â Áö±Ý ÄÄÆÄÀÏ·¯°¡ ½ÇÇàµÇ°í ÀÖ´Â ÇöÀç µð·ºÅ丮¸¦ ±âÁØÀ¸·Î Çì´õ ÈÀÏÀ» ã½À´Ï´Ù.
ÀÌ µÎ µð·ºÅ丮°¡ ¾Æ´Ñ °÷¿¡ ´ëÇؼ´Â ¸í½ÃÀûÀ¸·Î -I<µð·ºÅ丮> ·Î Á¤ÇØÁÝ´Ï´Ù.
$ gcc -c myprog1.c -I.. $ gcc -c myprog1.c -Iinclude
ù¹ø°´Â Çì´õ ÈÀÏÀÌ ÇöÀç ¼Ò½º ÇÏÀ§ µð·ºÅ丮(..)¿¡ ÀÖ´Ù´Â ¶æÀÌ¸ç µÎ¹ø°´Â ÇöÀç µð·ºÅ丮ÀÇ include¶ó´Â µð·ºÅ丮¿¡ µé¾îÀÖ´Ù´Â ¶æÀÔ´Ï´Ù.
-I ¿É¼ÇÀº ¾ó¸¶µçÁö ¿©·¯¹ø ¾µ ¼ö ÀÖÀ¸¸ç ÁÖ¾îÁø ¼ø¼´ë·Î Çì´õ ÈÀÏÀ» °Ë»öÇÕ´Ï´Ù.
µð·ºÅ丮¸íÀº -I ¶ó´Â ¹®ÀÚ ¹Ù·Î ´ÙÀ½¿¡ ºÙ¿©¼ ¾¹´Ï´Ù. Áï -I <µð·ºÅ丮>¶ó´Â ½ÄÀÌ ¾Æ´Ï¶ó -I<µð·ºÅ丮> ÀÔ´Ï´Ù. ¶ÇÇÑ À¯´Ð½º¿¡ ÀÖ¾î Ç¥ÁØ Çì´õ ÈÀÏ µð·ºÅ丮´Â /usr/include ¶ó´Â »ç½ÇÀ» ±â¾ïÇϽñ⠹ٶø´Ï´Ù. ¶ÇÇÑ ¸®´ª½º¿¡ À־ Ŀ³Î ¼Ò½º°¡ ¾ÆÁÖ Áß¿äÇѵ¥ ¸®´ª½º °íÀ¯ÀÇ ±â´ÉÀ» ¾²´Â ¸®´ª½º¿ë ÇÁ·Î±×·¥ÀÇ °æ¿ì¿¡´Â /usr/include/linux, /usr/include/asm, /usr/include/scsi (ÃֽŠĿ³ÎÀÇ °æ¿ì) ¶ó´Â µð·ºÅ丮°¡ ²À ÀÖ¾î¾ß ÇÏ¸ç °¢°¢Àº Ä¿³Î ¼Ò½ºÀÇ Çì´õ µð·ºÅ丮¿¡ ´ëÇÑ ¸µÅ©ÀÔ´Ï´Ù. µû¶ó¼ Ä¿³Î ¼Ò½º¸¦ ²À ¼³Ä¡ÇØµÎ¼Å¾ß ÇÕ´Ï´Ù.
/usr/include/linux --------------> /usr/src/linux/include/linux /usr/include/asm --------------> /usr/src/linux/include/asm /usr/include/scsi --------------> /usr/src/linux/include/scsi
( À§¿¡¼ /usr/src/linux/include/asmÀº »ç½Ç ´ëºÎºÐÀÇ °æ¿ì /usr/src/linux/include/asm-i386 À̶ó´Â µð·ºÅ丮¿¡ ´ëÇÑ ¸µÅ©ÀÔ´Ï´Ù )
°¢°¢ linux´Â ÀϹÝÀûÀÎ C Çì´õ ÈÀÏ, asmÀº °¢ ¾ÆÅ°ÅØÃĺ° ÀÇÁ¸ÀûÀÎ ¾î¼Àºí¸® Çì´õ ÈÀÏ, ¸Ç ¸¶Áö¸·Àº SCSI ÀåÄ¡ ÇÁ·Î±×·¡¹Ö¿¡ ¾²ÀÌ´Â Çì´õ ÈÀÏÀÌ µé¾îÀÖ´Â °÷ÀÔ´Ï´Ù.
ÀϹÝÀûÀ¸·Î Ä¿³Î ¼Ò½º( ¾à 6 ¸Þ°¡ ÀÌ»óµÇ´Â ¼Ò½º )´Â /usr/src ¿¡¼ tar, gzipÀ¸·Î Ç®¾îµÎ´Â °ÍÀÌ °ü·ÊÀÔ´Ï´Ù.
¸Ç óÀ½ ÇÁ·Î±×·¡¹ÖÀ» ÇÒ ¶§´Â ±×·¸°Ô ¸¹ÀÌ ¾²Áö´Â ¾Ê´Â ¿É¼ÇÀÌÁö¸¸ ¿©·¯ºÐÀÌ ´Ù¸¥ ¼Ò½º¸¦ °¡Á®´Ù ÄÄÆÄÀÏÇÒ ¶§ ¾ÆÁÖ ¸¹ÀÌ º¸°Ô µÇ´Â ¿É¼ÇÀ̹ǷΠÀÏ´Ü ÀÌÇØ´Â ÇÒ ¼ö ÀÖ¾î¾ß°ÚÁÒ?
¿É¼ÇÀ» Á¦´ë·Î ÀÌÇØÇϱ⿡ ¾Õ¼ ``¶óÀ̺귯¸®''¶ó´Â °Í¿¡ ´ëÇÑ À̾߱⸦ ¸Õ Àú ÇÏÁö ¾ÊÀ¸¸é ¾ÈµÉ µí Çϱº¿ä.
``¶óÀ̺귯¸®(Library)''¶ó´Â °ÍÀº °³³ä»ó ¿µ¾î ´Ü¾î ±×´ë·ÎÀÔ´Ï´Ù.
¹«¾ùÀΰ¡ À¯¿ëÇÑ Áö½ÄÀ» ÇÑ °÷¿¡ ¸ð¾ÆµÐ °÷À̶ó´Â °³³äÀÌÁö¿ä.
C ÇÁ·Î±×·¡¹ÖÀ» ÇÏ´Ù º¸¸é ¹Ýº¹ÀûÀ¸·Î »ç¿ëÇÏ°Ô µÇ´Â ÇÔ¼öµéÀÌ ÀÖ±â
¸¶·ÃÀÌ°í ±×°ÍÀº ÇϳªÀÇ ÇÔ¼ö·Î ¶¼³»¾î ¾îµð¿¡¼µç À¯¿ëÇÏ°Ô »ç¿ëÇÒ
¼ö ÀÖµµ·Ï ÇÕ´Ï´Ù.
ÀÌ ÇÔ¼ö°¡ ±Øµµ·Î ¸¹ÀÌ »ç¿ëµÇ´Â °æ¿ì¿¡´Â ``¶óÀ̺귯¸®''¶ó´Â °ÍÀ¸
·Î ¸¸µé¾îµÎ°í ¸Å¹ø ÄÄÆÄÀÏÇØµÑ ÇÊ¿ä¾øÀÌ °¡Á®´Ù »ç¿ëÇÒ ¼ö ÀÖµµ·Ï
ÇÏÁö¿ä.
¶óÀ̺귯¸®¿¡ ´ëÇÑ ¾ê±â´Â ´ÙÀ½ ¹ø¿¡ ¶Ç ÇÏ°Ô µÇ°ÚÁö¸¸ ÀÏ´Ü Áö±Ý
ÇÊ¿äÇÑ Áö½Ä¸¸ ½×±â·Î ÇÏ°Ú½À´Ï´Ù.
ÀϹÝÀûÀ¸·Î °ü·Ê»ó ¶óÀ̺귯¸®´Â ÈÀÏ¸í ³¡ÀÌ .a ·Î ³¡³³´Ï´Ù.
¿©±â¼ a ´Â Archive ¶ó´Â ÀǹÌÀÏ °ÍÀÔ´Ï´Ù.
¶óÀ̺귯¸®ÀÇ ¿¹¸¦ µé¾îº¸µµ·Ï ÇÏÁÒ. Áö±Ý /usr/lib µð·ºÅ丮¸¦ ÇÑ
¹ø ±¸°æÇغ¸½Ê½Ã¿ä. Á¤¸»·Î ¸¹Àº ¶óÀ̺귯¸®µéÀÌ ÀÖÁö¿ä.
libc.a
libm.a
libdb.a
libelf.a
libfl.a
libg++.a
libg.a
libncurses.a
libreadline.a
libvga.a
µîµî...
ÀÌ·¯ÇÑ ¶óÀ̺귯¸®´Â ¿ì¸®°¡ ÄÄÆÄÀÏ °úÁ¤À» °ÅÃļ ¸¸µç .o ÈÀÏÀ»
ÇÑ °÷¿¡ Åëµé¾î °ü¸®ÇÏ´Â °Í¿¡ ºÒ°úÇÕ´Ï´Ù. µû¶ó¼ archive ¸¦ ÀǹÌ
ÇÏ´Â .a ¶ó°í À̸§À» Áþ°Ô µÈ °ÍÀÌÁÒ. ¶óÀ̺귯¸®´Â ``µµ¼°ü''À¸·Î
¼ ±×³É .o ¸¦ ¹«ÀÛÀ§·Î Áý¾î³ÖÀº °ÍÀº ¾Æ´Ï°í ´ç¿¬È÷ µµ¼°ü¿¡´Â
¼ÒÀåÇÏ°í Àִ å¿¡ ´ëÇÑ ¸ñ·Ï(index)À» °¡Áöµí Æ÷ÇԵǾî ÀÖ´Â .o
¿¡ ´ëÇÑ À妽º(index)¸¦ °¡Áö°í ÀÖ½À´Ï´Ù.
¶óÀ̺귯¸®´Â ´ÙÀ½°ú °°ÀÌ ±¸¼ºµÇ¾î ÀÖ´Ù°í ÇÒ ¼ö ÀÖ´Â °ÍÀÔ´Ï´Ù.
¶óÀ̺귯¸® = ¸ñÂ÷(index) + ( a.o + b.o + c.o + ... )
libc.a ¸¦ °¡Áö°í ÇÑ ¹ø ³î¾Æº¼±î¿ä? ¶óÀ̺귯¸® ¾ÆÄ«À̺긦 °ü¸®ÇÏ
´Â ar À̶ó´Â GNU À¯Æ¿¸®Æ¼¸¦ ½áº¸°Ú½À´Ï´Ù.
$ cd /usr/lib
$ ar t libc.a
assert-perr.o
assert.o
setenv.o
ftime.o
psignal.o
mkstemp.o
sigint.o
realpath.o
cvt.o
gcvt.o
ctype-extn.o
ctype.o
<µîµî... °è¼Ó>
$ ar t libc.a | grep printf
iofprintf.o
ioprintf.o
iosprintf.o
iovsprintf.o
iovfprintf.o
printf_fp.o
vprintf.o
snprintf.o
vsnprintf.o
asprintf.o
vasprintf.o
printf-prs.o
reg-printf.o
$
À§¿¡¼ º¼ ¼ö ÀÖ´Ù½ÃÇÇ .o ÈÀϵéÀÌ ±× ¾È¿¡ µé¾îÀÖ½À´Ï´Ù.
<ÁÖ¸ñ>
À¯´Ð½º¿¡¼ ¶óÀ̺귯¸® À̸§Àº lib ·Î ½ÃÀÛÇÕ´Ï´Ù.
°£´ÜÇÏ°Ô ¶óÀ̺귯¸®¸¦ Çϳª ¸¸µé¾î¼ »ç¿ëÇغ¸µµ·Ï ÇսôÙ.
À̹ø ¿¹Á¦´Â 3 °³ÀÇ ÈÀÏ·Î ÀÌ·ç¾îÁ³½À´Ï´Ù.
myfunc.h myfunc.c hello.c
ù¹ø° myfunc.h Çì´õ ÈÀÏÀÇ ³»¿ëÀÔ´Ï´Ù.
extern void say_hello ( void );
µÎ¹ø° myfunc.c, ½ÇÁ¦ ÇÔ¼ö Á¤ÀǺÎÀÔ´Ï´Ù.
#include <stdio.h> #include "myfunc.h" void say_hello ( void ) { printf ( "Hello, Linux guys!\n" ); }
¸¶Áö¸·À¸·Î ¸ÞÀÎ ÇÔ¼ö(main)°¡ µé¾îÀÖ´Â hello.c ÀÔ´Ï´Ù.
#include "myfunc.h" int main ( void ) { say_hello (); return 0; }
main ÇÔ¼ö¿¡¼ say_hello ¶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇÏ°Ô µË´Ï´Ù. ÀÌ Á¤µµ¾ß ±×³É ÀÌ·¸°Ô Çعö¸®°í ¸»ÁÒ ^^
$ gcc -o say_linux hello.c myfunc.c
ÇÏÁö¸¸ ¶óÀ̺귯¸®¸¦ ¸¸µé¾îº¸°í ½ÃÇèÇغ¸·Á°í ÇÏ´Â °ÍÀ̹ǷΠÀϺη¯ ¾î·Æ°Ô ÇÑ ¹ø Çغ¸±â·Î ÇÏ°Ú½À´Ï´Ù.
$ gcc -c myfunc.c $ ar r libmylib.a myfunc.o $ ar s libmylib.a $ ar t libmylib.a myfunc.o $ gcc -o say_linux hello.c -lmylib ^^^^^^^^ ld: cannot open -lmylib: No such file or directory
Èì... óÀ½ºÎÅÍ ¸¸¸¸Ä¡ ¾ÊÁÒ? ^^ ½ÇÆÐÇϱä ÇßÁö¸¸ ¸î °¡Áö¸¦ ÀÏ´Ü ¾Ë¾Æº¾½Ã´Ù.
¸µÅ©(link)ÇÒ ¶óÀ̺귯¸®¸¦ ¸í½ÃÇØÁÖ´Â ¿É¼ÇÀÌ ¹Ù·Î -l ( ¼Ò¹®ÀÚ L ) ¿É¼ÇÀÔ´Ï´Ù.
-I ¿É¼Ç°ú ¸¶Âù°¡Áö·Î ¹Ù¦ ºÙ¿©¼ ¾¹´Ï´Ù. Àý´ë ¶¼¸é ¾ÈµË´Ï´Ù.
¿ì¸®´Â libmylib.a ¶ó´Â ¶óÀ̺귯¸®¸¦ ¸¸µé¾îµÎ¾ú½À´Ï´Ù. ±×°ÍÀ» »ç¿ëÇϱâ À§Çؼ´Â -lmylib ¶ó°í Àû¾îÁÝ´Ï´Ù. ¶óÀ̺귯¸® ÈÀÏ¸í¿¡¼ ¾î¶² ±ÛÀÚµéÀ» ¶¼³»°í ¾²´ÂÁö ÁÖ¸ñÇϽʽÿä.
libmylib.a ^^^^^
¾ÕÀÇ lib ¸¦ ¶¼³»°í ¸Ç µÚ¿¡ ºÙ´Â .a ¸¦ ¶¼³À´Ï´Ù.
¸µÅ©(link)¶ó´Â °ÍÀÌ ¾î¶² °ÍÀÌ ¸ð¸£½Å´Ù¸é ´çÀå C ÇÁ·Î±×·¡¹Ö Ã¥À» ´Ù½Ã Àо½Ã±â ¹Ù¶ø´Ï´Ù. ÀÌ ±Û¿¡¼ ¼³¸íÇÒ ¹üÀ§´Â ¾Æ´Ñ µí ÇÕ´Ï´Ù.
ld ´Â À¯´Ð½º¿¡¼ »ç¿ëµÇ´Â ¸µÄ¿(Linker)ÀÔ´Ï´Ù. C ÇÁ·Î±×·¥ ÄÄÆÄÀÏÀÇ ¸Ç ¸¶Áö¸· ´Ü°è¸¦ ¸Ã°Ô µÇÁö¿ä.
À§¿¡¼ ¿ì¸®´Â ´ÙÀ½°ú °°Àº ¿¡·¯ ¸Þ¼¼Áö¸¦ ¸¸³µ½À´Ï´Ù.
ld: cannot open -lmylib: No such file or directory
ÀÚ, ÀÌÁ¦ ¹è¿ö¾ß ÇÒ ¿É¼ÇÀº ``¶óÀ̺귯¸®ÀÇ À§Ä¡¸¦ Á¤ÇØÁÖ´Â'' -L ( ´ë¹®ÀÚ L ) ¿É¼ÇÀÔ´Ï´Ù. »ç¿ëÇü½ÄÀº -L<µð·ºÅ丮¸í> ÀÔ´Ï´Ù.
¸®´ª½º¿¡¼ ¾î¶² ¶óÀ̺귯¸®¸¦ ãÀ» ¶§´Â /lib, /usr/lib, /usr/local/lib¿Í °°Àº Á¤ÇØÁø Àå¼Ò¿¡¼¸¸ ã°Ô µÇ¾î ÀÖ½À´Ï´Ù. ±×°ÍÀº ±ÔÄ¢ÀÌÁö¿ä.
Áß¿äÇÑ »ç½ÇÀº ¾Æ¹«¸® ¿©·¯ºÐ ¶óÀ̺귯¸®¸¦ ÇöÀç ÀÛ¾÷ µð·ºÅ丮¿¡ ³õ¾ÆµÎ¾îµµ ld ´Â ±×°ÍÀ» ãÁö ¾Ê´Â´Ù´Â »ç½ÇÀÔ´Ï´Ù. ld ´õ·¯ ¶óÀ̺귯¸®°¡ ÀÖ´Â Àå¼Ò¸¦ ¾Ë·ÁÁÖ·Á¸é ´ÙÀ½°ú °°ÀÌ -L ¿É¼ÇÀ» ºÙÀ̽ʽÿä.
$ gcc -o say_linux hello.c -lmylib -L. ^^^
-L. Àº ÇöÀç µð·ºÅ丮¿¡¼ ¶óÀ̺귯¸®¸¦ ãÀ¸¶ó´Â ¸»ÀÔ´Ï´Ù. -L ¿É¼ÇÀº ¿©·¯¹ø ÁÙ ¼ö ÀÖ½À´Ï´Ù.
¼º°øÀûÀ¸·Î ÄÄÆÄÀϵǾúÀ» °Ì´Ï´Ù.
$ ./say_linux Hello, Linux guys!
Áö±Ý±îÁö ¿©·¯ºÐÀº gcc ¿É¼Ç Áß µÎ¹ø°·Î Áß¿äÇÑ -I, -l, -L ¿É¼Ç¿¡ ´ëÇÏ¿© ¹è¿ì¼Ì½À´Ï´Ù. ±×¸®°í ¶ÇÇÑ ¶óÀ̺귯¸® ¸¸µé±â¿¡ ´ëÇÏ¿© ¸Àº¸±â¸¦ ÇÏ¿´½À´Ï´Ù.