ÀÌÀüÆäÀÌÁö ´ÙÀ½ÆäÀÌÁö Â÷·Ê

2. gcc °­ÁÂ

2.1 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

±¸¼º¿ä¼Ò°¡ ¾î¶² °ÍÀÎÁö ¾Æ¼ÌÀ¸´Ï Á» µµ¿òÀÌ µÇ¼ÌÀ» °Ì´Ï´Ù.

2.2 gcc »ç¿ëÇϱâ

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 ¿É¼Ç( ¼Ò¹®ÀÚ 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! =)
 $

-c ¿É¼Ç

¾î¶² ÀÌÀ¯·Î ¿À·ÎÁö ÄÄÆÄÀÏ(compile) ÀÛ¾÷¸¸ ÇÏ°í ½ÍÀº °æ¿ì°¡ ÀÖ½À´Ï´Ù. ±×·² ¶§´Â ´ÙÀ½°ú °°ÀÌ ÇÕ´Ï´Ù.

 $ gcc -c hello.c
 $

±× °á°ú ¸¸µé¾îÁö´Â È­ÀÏÀº ÀüÅëÀûÀ¸·Î hello.c ¿¡¼­ .c ºÎºÐÀ» ¶¼¾î³»°í .o ¸¦ ºÙÀÎ È­ÀÏÀÔ´Ï´Ù. ¿ÀºêÁ§Æ® È­ÀÏ, ¸ñÀû È­ÀÏÀ̶ó°í ÇÏÁö¿ä.

hello.o ¶ó´Â È­ÀÏÀÌ ¸¸µé¾îÁý´Ï´Ù.

¿©·¯ºÐÀº C ¾ð¾î·Î Á¶±ÝÀÌ¶óµµ º¹ÀâÇÑ ÇÁ·Î±×·¥À» ¸¸µé±â ½ÃÀÛÇÏ¸é ¿©·¯ °³ÀÇ ¼Ò½º·Î ³ª´©¾î¼­ Àüü ÇÁ·Î±×·¥À» Â¥°Ô µË´Ï´Ù. ±×·² ¶§´Â °¢ ¼Ò½º°¡ Àüü ±â´É¿¡ ±â¿©Çϴ ƯÁ¤ ±â´ÉÀÇ ÇÔ¼öµéÀ» °¡Áö°Ô µÇ°í ¿À·ÎÁö ÇÑ ³à¼®¸¸ main ÇÔ¼ö¸¦ °¡Áý´Ï´Ù.

¸¸¾à ¾î¶² ÇÁ·Î±×·¥ÀÌ foo.c, bar.c ÀÌ·¸°Ô µÎ °³ÀÇ ¼Ò½º·Î ÀÌ·ç¾îÁ® ÀÖ´Ù°í ÇսôÙ. ÀÌ·² ¶§´Â ´ÙÀ½°ú °°ÀÌ ÇÏ´Â °ÍÀÌ °¡´ÉÇÕ´Ï´Ù.

¹æ¹ý(1)

 $ gcc -o baz foo.c bar.c
 $ ./baz

¹æ¹ý(2)

 $ 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. ÄÄÆÄÀÏ ( .c -------> .o )
  2. ¸µÅ© ( .o -------> ½ÇÇàÈ­ÀÏ a.out )

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 ¸¦ »ç¿ëÇÏÁö ¾Ê¾Ò´Ù!

-I ¿É¼Ç

#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À¸·Î Ç®¾îµÎ´Â °ÍÀÌ °ü·ÊÀÔ´Ï´Ù.

¸Ç óÀ½ ÇÁ·Î±×·¡¹ÖÀ» ÇÒ ¶§´Â ±×·¸°Ô ¸¹ÀÌ ¾²Áö´Â ¾Ê´Â ¿É¼ÇÀÌÁö¸¸ ¿©·¯ºÐÀÌ ´Ù¸¥ ¼Ò½º¸¦ °¡Á®´Ù ÄÄÆÄÀÏÇÒ ¶§ ¾ÆÁÖ ¸¹ÀÌ º¸°Ô µÇ´Â ¿É¼ÇÀ̹ǷΠÀÏ´Ü ÀÌÇØ´Â ÇÒ ¼ö ÀÖ¾î¾ß°ÚÁÒ?

-l ¿É¼Ç°ú -L ¿É¼Ç

¿É¼ÇÀ» Á¦´ë·Î ÀÌÇØÇϱ⿡ ¾Õ¼­ ``¶óÀ̺귯¸®''¶ó´Â °Í¿¡ ´ëÇÑ À̾߱⸦ ¸Õ Àú ÇÏÁö ¾ÊÀ¸¸é ¾ÈµÉ µí Çϱº¿ä.


       ``¶óÀ̺귯¸®(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

Èì... óÀ½ºÎÅÍ ¸¸¸¸Ä¡ ¾ÊÁÒ? ^^ ½ÇÆÐÇϱä ÇßÁö¸¸ ¸î °¡Áö¸¦ ÀÏ´Ü ¾Ë¾Æº¾½Ã´Ù.

-l ¿É¼Ç

¸µÅ©(link)ÇÒ ¶óÀ̺귯¸®¸¦ ¸í½ÃÇØÁÖ´Â ¿É¼ÇÀÌ ¹Ù·Î -l ( ¼Ò¹®ÀÚ L ) ¿É¼ÇÀÔ´Ï´Ù.

-I ¿É¼Ç°ú ¸¶Âù°¡Áö·Î ¹Ù¦ ºÙ¿©¼­ ¾¹´Ï´Ù. Àý´ë ¶¼¸é ¾ÈµË´Ï´Ù.

¿ì¸®´Â libmylib.a ¶ó´Â ¶óÀ̺귯¸®¸¦ ¸¸µé¾îµÎ¾ú½À´Ï´Ù. ±×°ÍÀ» »ç¿ëÇϱâ À§Çؼ­´Â -lmylib ¶ó°í Àû¾îÁÝ´Ï´Ù. ¶óÀ̺귯¸® È­ÀÏ¸í¿¡¼­ ¾î¶² ±ÛÀÚµéÀ» ¶¼³»°í ¾²´ÂÁö ÁÖ¸ñÇϽʽÿä.

 libmylib.a
    ^^^^^  

¾ÕÀÇ lib ¸¦ ¶¼³»°í ¸Ç µÚ¿¡ ºÙ´Â .a ¸¦ ¶¼³À´Ï´Ù.

¸µÅ©(link)¶ó´Â °ÍÀÌ ¾î¶² °ÍÀÌ ¸ð¸£½Å´Ù¸é ´çÀå C ÇÁ·Î±×·¡¹Ö Ã¥À» ´Ù½Ã Àо½Ã±â ¹Ù¶ø´Ï´Ù. ÀÌ ±Û¿¡¼­ ¼³¸íÇÒ ¹üÀ§´Â ¾Æ´Ñ µí ÇÕ´Ï´Ù.

-L ¿É¼Ç

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 ¿É¼Ç¿¡ ´ëÇÏ¿© ¹è¿ì¼Ì½À´Ï´Ù. ±×¸®°í ¶ÇÇÑ ¶óÀ̺귯¸® ¸¸µé±â¿¡ ´ëÇÏ¿© ¸Àº¸±â¸¦ ÇÏ¿´½À´Ï´Ù.


ÀÌÀüÆäÀÌÁö ´ÙÀ½ÆäÀÌÁö Â÷·Ê