· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Docbook Sgml/C++-dlopen

C++ dlopen mini HOWTO

C++ dlopen mini HOWTO

IsottonAaron

±è°æÅÂ

dlopen API¸¦ ÀÌ¿ëÇÏ¿© µ¿ÀûÀ¸·Î C++ ÇÔ¼ö¿Í Ŭ·¡½º¸¦ ÀûÀçÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.

고친 과정
고침 1.002002-06-19고친이 AI
copyright¿Í licenseºÎºÐÀ» ¾ÕÂÊÀ¸·Î ¿Å°å´Ù. ¿ë¾î¿¡ °üÇÑ ºÎºÐÀ» Ãß°¡Çß´Ù. ¾à°£ º¯È­°¡ ÀÖ¾ú´Ù.
고침 0.972002-06-19고친이 JYG
¹®Àå°ú ¹®¹ýÀ» ¾à°£ °¡´Ùµë¾ú´Ù.
고침 0.962002-06-12고친이 AI
Âü°í ¹®ÇåÀ» Ãß°¡Çß´Ù. ¿ÜºÎ ÇÔ¼ö¿Í º¯¼öµéÀÇ ¼³¸íÀ» ¼öÁ¤Çß´Ù.
고침 0.952002-06-11고친이 AI
¾ÆÁÖ ¾à°£ °³¼±.
고침 0.92002-06-10고친이 AI
ÃÊ¾È ÀÛ¼º.

1. ¼Ò°³

Unix C++ ÇÁ·Î±×·¡¸Ó »çÀÌ¿¡¼­ ÀÚÁÖ ¹ß»ýÇÏ´Â Áú¹®Àº dlopenAPI¸¦ ÀÌ¿ëÇÏ¿© C++ ÇÔ¼ö¿Í Ŭ·¡½º¸¦ ÀûÀçÇÏ´Â ¹æ¹ý¿¡ °üÇÑ °ÍÀÔ´Ï´Ù.

»ç½Ç ÀÌ°ÍÀº Ç×»ó °£´ÜÇÑ °Í¸¸Àº ¾Æ´Ï±â ¶§¹®¿¡,¾à°£ÀÇ ¼³¸íÀÌ ÇÊ¿äÇÕ´Ï´Ù. ÀÌ mini HOWTO¿¡¼­ ±×°Í¿¡ °üÇÑ ³»¿ëÀ» ´Ù·ç°í ÀÖ½À´Ï´Ù.

ÀÌ ¹®¼­¸¦ ÀÌÇØÇϱâ À§Çؼ­´Â C, C++,±×¸®°ídlopen API ¿¡ ´ëÇؼ­ ¾î´À Á¤µµ ¾Ë°í ÀÖ¾î¾ß ÇÒ °ÍÀÔ´Ï´Ù.

ÀÌ HOWTOÀÇ ¿ø¹®Àº http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/¿¡ ÀÖ½À´Ï´Ù.


1.1. Copyright and License

ÀÌ ¹®¼­ C++ dlopen mini HOWTOÀÇ ÀúÀÛ±ÇÀº Aaron Isotton ¿¡°Ô ÀÖ½À´Ï´Ù. ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´Ü¿¡¼­ ¹ßÇ¥ÇÑ, 1.1 ȤÀº ±× ÀÌÈÄ ¹öÀüÀÇ GNU Free Documentation LicenseÀÇ Á¶Ç׿¡ µû¶ó ÀÌ ¹®¼­¸¦ º¹»çÇϰųª, ¹èÆ÷ ȤÀº º¯°æÇÏ´Â °ÍÀÌ Çã¿ëµË´Ï´Ù.


1.2. °æ°í(Disclaimer)

ÀÌ ¹®¼­ÀÇ ³»¿ëÀ¸·Î ÀÎÇÑ Ã¥ÀÓÀº ÁöÁö ¾Ê½À´Ï´Ù. ¿©±â¿¡ ¾²¿©Áø °³³äÀ̳ª ¿¹Á¦ ±×¸®°í Á¤º¸¸¦ »ç¿ëÇÏ¿© ¹ß»ýÇÑ ¹®Á¦¿¡ ´ëÇÑ Ã¥ÀÓÀº ¸ðµÎ ´ç½ÅÀÇ Ã¥ÀÓÀÔ´Ï´Ù. ¿©±â¿¡´Â ´ç½ÅÀÇ ½Ã½ºÅÛ¿¡ ÇÇÇظ¦ ÁÙ ¼ö ÀÖ´Â ¿À·ù³ª ºÎÁ¤È®ÇÑ °ÍµéÀÌ ÀÖÀ»¼öµµ ÀÖ½À´Ï´Ù. ÁÖÀÇÇÏ¿© Áֽñ⠹ٶó¸ç, Àú´Â ¿©±â¿¡ ¾î¶°ÇÑ Ã¥ÀÓµµ ÁöÁö ¾ÊÀ» °ÍÀÔ´Ï´Ù.

¸ðµç ÀúÀÛ±ÇÀº ±¸Ã¼ÀûÀ¸·Î ¾ð±ÞÇÏÁö ¾Ê¾Ò´Ù¸é, ±×°Íµé °¢°¢ÀÇ ¼ÒÀ¯ÀÚ°¡ °¡Áö°í ÀÖ½À´Ï´Ù. ÀÌ ¹®¼­¿¡ ÀÖ´Â ¿ë¾îÀÇ »ç¿ëÀÌ ¾î´À µî·Ï»óÇ¥³ª ¼­ºñ½º ¸¶Å©ÀÇ È¿·Â¿¡ ¿µÇâÀ» ³¢Ä¡´Â °ÍÀ¸·Î °£ÁÖÇؼ­´Â ¾È µË´Ï´Ù. Ưº°ÇÑ Á¦Ç°À̳ª ºê·£µå¸¦ Áö¸íÇÏ´Â °ÍÀÌ »óÇ°µîÀÇ ÃßõÀ¸·Î º¸¿©¼­´Â ¾È µË´Ï´Ù.


1.3. µµ¿Í ÁֽźÐ

ÀÌ ¹®¼­¿¡¼­, ³ª´Â ÀÌ ºÐµé²² °¨»çÇÏ°Ô µÇ¾î ±â»Ú°Ô »ý°¢ÇÕ´Ï´Ù.

  • Joy Y Goodreau ¾¾ ´Â ±³Á¤¿¡ µµ¿òÀ» Áּ̽À´Ï´Ù.

  • D. Stimitis ¾¾ ´Â formatting °ú name mangling¿¡ ´ëÇÑ ¸î°¡Áö À̽´¸¦ ÁöÀûÇØÁּ̰í, extern "C"¿¡ ´ëÇÑ ¸î°¡Áö ³­ÇØÇÑ Á¡À» ÁöÀûÇØÁּ̽À´Ï´Ù.


1.4. Feedback

ÀÌ ¹®¼­¿¡ ´ëÇÑ ¹ÝÀÀÀº ¾ðÁ¦³ª ȯ¿µÀÔ´Ï´Ù. ´ç½ÅÀÌ Ãß°¡ÇßÀ¸¸é ÇÏ´Â °Í, ÀÇ°ß, ºñÆÇÀ» ´ÙÀ½ ÁÖ¼Ò·Î º¸³»Áֽñ⠹ٶø´Ï´Ù .


1.5. ÀÌ ¹®¼­¿¡¼­ ¾²ÀÎ ¿ë¾îµé

dlopen API

dlclose, dlerror, dlopen,±×¸®°í dlsym ÇÔ¼ö´Â dlopen(3) ¸Å´º¾ó ÆäÀÌÁö¿¡¼­ ¼³¸íÇÏ°í ÀÖ½À´Ï´Ù.

ÀÌ ±Û¿¡¼­"dlopen"À̶ó°í ½èÀ» ¶§´Â, dlopenÇÔ¼ö Çϳª¸¦ ÁöĪÇÏ´Â °ÍÀÌ°í, "dlopen API" ¶ó°í ½èÀ» ¶§¿¡´Â, API Àüü¸¦ ÁöĪÇÏ´Â °ÍÀÔ´Ï´Ù.


2. ¹®Á¦

ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ¶§, ¶óÀ̺귯¸®¸¦ ÀûÀçÇØ¾ß ÇÒ ¶§°¡ °¡²û¾¿ ÀÖÀ» °ÍÀÔ´Ï´Ù. ´ç½ÅÀÌ ÇÁ·Î±×·¥¿¡ µé¾î°¡´Â Ç÷¯±×ÀÎÀ̳ª ¸ðµâÀ» ¸¸µé°í ÀÖÀ»¶§ ÀÌ·¯ÇÑ ÀÏÀº Á¾Á¾ ¹ß»ýÇÕ´Ï´Ù.

C¾ð¾î¿¡¼­, µ¿ÀûÀ¸·Î ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ´Â °ÍÀº ¸Å¿ì °£´ÜÇÕ´Ï´Ù. (dlopen, dlsym ±×¸®°í dlclose¸¦ È£ÃâÇÏ´Â °Í¸¸À¸·Î ÃæºÐÇÕ´Ï´Ù) C++¿¡¼­´Â ¾à°£ ´õ º¹ÀâÇÕ´Ï´Ù. C++ ¶óÀ̺귯¸®¸¦ µ¿ÀûÀ¸·Î ÀûÀçÇÏ´Â °ÍÀÌ ¾î·Á¿î ÀÌÀ¯Áß¿¡ ÀϺκÐÀºname mangling ¶§¹®ÀÌ°í, ÀϺκÐÀº dlopen API°¡ C¸¦ ¿°µÎ¿¡ µÎ°í ¸¸µé¾îÁ³±â ¶§¹®¿¡ class¸¦ ÀûÀçÇÏ´Â Àû´çÇÑ ¹æ¹ýÀ» Á¦°øÇÏÁö ¸øÇϱ⠶§¹®ÀÔ´Ï´Ù.

C++¿¡¼­ ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¼³¸íÇϱâ Àü¿¡, name mangling¿¡ ´ëÇؼ­ ÀÚ¼¼È÷ »ìÆ캸°í, ¹®Á¦¸¦ ºÐ¼®ÇØ º¾½Ã´Ù. ºñ·Ï ´ç½ÅÀÌ name mangling¿¡ °ü½ÉÀÌ ¾ø´õ¶óµµ, ³ª´Â ´ç½ÅÀÌ ±×°Í¿¡ ´ëÇÑ ¼³¸íÀ» Àб⸦ ¹Ù¶ø´Ï´Ù. ¿Ö³ÄÇÏ¸é ±×°ÍÀº ´ç½ÅÀÌ ¿Ö ¹®Á¦°¡ ¹ß»ýÇÏ°í ¾î¶»°³ ÇØ°áÇØ¾ß ÇÏ´ÂÁö¸¦ ÀÌÇØÇϴµ¥ µµ¿òÀ» Áֱ⠶§¹®ÀÔ´Ï´Ù.


2.1. Name Mangling

¸ðµç C++ÇÁ·Î±×·¥(ȤÀº ¶óÀ̺귯¸®³ª Object ÆÄÀÏ)¿¡¼­, ¸ðµç non-static ÇÔ¼ö´Â ÀÌÁø ÆÄÀÏ¿¡¼­ symbol·Î Ç¥ÇöµË´Ï´Ù. ÀÌ·¯ÇÑ symbolµéÀº ÇÁ·Î±×·¥(ȤÀº ¶óÀ̺귯¸®³ª Object ÆÄÀÏ)¿¡¼­, À¯ÀÏÇÏ°Ô ÇÔ¼ö¸¦ È®ÀÎÇÏ´Â, Ư¼öÇÑ ¹®ÀÚ¿­ÀÔ´Ï´Ù.

C¿¡¼­´Â, symbolÀÇ À̸§Àº ÇÔ¼öÀÇ À̸§°ú µ¿ÀÏÇÕ´Ï´Ù. strcpyÀÇ symbolÀº strcpyÀÔ´Ï´Ù. C¿¡¼­´Â µÎ°³ÀÇ non-static ÇÔ¼ö°¡ °°Àº À̸§À» °¡Áú ¼ö ¾ø±â ¶§¹®¿¡ ÀÌ°ÍÀÌ °¡´ÉÇÕ´Ï´Ù.

C++Àº ¿À¹ö·ÎµùÀ» Çã¿ëÇÏ°í (°°Àº À̸§À» °¡ÁöÁö¸¸ ÀÎÀÚ°¡ ´Ù¸¥ ÇÔ¼ö¸¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù), C°¡ °¡Áö°í ÀÖÁö ¾ÊÀº ¿©·¯°¡Áö Ư¡µé — Class, member function, exception specifications — À» °¡Áö°í Àֱ⠶§¹®¿¡, ±×³É ´Ü¼øÈ÷ ÇÔ¼ö À̸§À» symbol À̸§À¸·Î ¾µ ¼ö´Â ¾ø½À´Ï´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­, C++¿¡¼­´Â name mangling(À̸§ ¾û¸ÁÀ¸·Î ¸¸µé±â)À̶ó´Â °ÍÀ» »ç¿ëÇÕ´Ï´Ù. ÀÌ°ÍÀº ÇÔ¼öÀ̸§°ú ¸ðµç ÇÊ¿äÇÑ Á¤º¸ ¸ðµÎ¸¦(ÀÎÀÚÀÇ Å©±â³ª °¹¼ö¿Í °°Àº) ÄÄÆÄÀÏ·¯¸¸ÀÌ ¾Ë¾Æº¼ ¼ö ÀÖ´Â ÀÌ»óÇÑ ¹®ÀÚ¿­·Î ¹Ù²ã¹ö¸³´Ï´Ù. ¿¹¸¦ µé¾î foo¶ó´Â ÇÔ¼ö°¡ ÀÖ´Ù¸é, name mangling¿¡ ÀÇÇØ foo@4%6^·Î ¹Ù²ð °ÍÀÔ´Ï´Ù.

name mangling°ú °ü·ÃÇÏ¿© »ý±â´Â ¹®Á¦Á¡ÀÇ Çϳª´Â C++ Ç¥ÁØ (ÇöÀç´Â [ISO14882])ÀÌ ±× ¹æ¹ýÀ» Á¤ÀÇÇØ ³õÁö ¾Ê¾Ò´Ù´Â Á¡ÀÔ´Ï´Ù. ÀÌ°ÍÀº ¸ðµç ÄÄÆÄÀÏ·¯µé¸¶´Ù Àڱ⸸ÀÇ ¹æ¹ý À¸·Î name manglingÀ» ÇÑ´Ù´Â °ÍÀ» ÀǹÌÇÕ´Ï´Ù. ¾î¶² ÄÄÆÄÀÏ·¯´Â name mangling ¾Ë°í¸®ÁòÀÌ ¹öÀü¿¡ µû¶ó ´Ù¸£±âµµ ÇÕ´Ï´Ù. (g++ 2.x ¿Í 3.x¿¡¼­ ¶Ñ·ÇÇÏ°Ô µå·¯³³´Ï´Ù.) ºñ·Ï ´ç½ÅÀÌ Æ¯Á¤ÇÑ ÄÄÆÄÀÏ·¯°¡ ¾î¶»°Ô À̸§À» ¹Ù²Ù´ÂÁö ÀÌÇØÇß´Ù°í Çصµ(±×·¡¼­ dlsymÀ» ÅëÇØ ±× ÇÔ¼ö¸¦ ÀûÀçÇÒ ¼ö ÀÖ°Ô µÈ´Ù°í Çصµ), ±×°ÍÀº ¾Æ¸¶ ±× ƯÁ¤ÇÑ ÄÄÆÄÀÏ·¯¿¡¼­¸¸ È¿°ú°¡ ÀÖÀ» °ÍÀÌ°í, ´ÙÀ½ ¹öÀüÀÇ ÄÄÆÄÀÏ·¯¿¡¼­´Â ÀÌ¹Ì »ç¿ëÇÒ ¼ö ¾øÀ»Áöµµ ¸ð¸¨´Ï´Ù.


2.2. Classes

dlopen API ÀÇ ¶Ç´Ù¸¥ ¹®Á¦´Â, À̵éÀÌÇÔ¼ö¸¦ ÀûÀçÇÏ´Â °Í¸¸À» Áö¿øÇÏ°í ÀÖ´Ù´Â Á¡ÀÔ´Ï´Ù. ÇÏÁö¸¸ C++¿¡¼­´Â ¶óÀ̺귯¸®°¡ Á¾Á¾ ´ç½ÅÀÌ ÇÁ·Î±×·¥¿¡¼­ ¾²°íÀÚ ÇÏ´Â Class¸¦ ³ëÃâ½ÃÅ°°í´Â ÇÕ´Ï´Ù. ºÐ¸íÈ÷, Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ­ ´ç½ÅÀº ±×°ÍÀÇ ÀνºÅϽº¸¦ ¸¸µé¾î¾ß ÇÏÁö¸¸, ±×°ÍÀº ½±Áö ¾Ê½À´Ï´Ù.


3. ÇØ°á ¹æ¹ý

3.1. extern "C"

C++¿¡´Â extern "C"¶ó´Â, C bindingÀ¸·Î ÇÔ¼ö¸¦ Á¤ÀÇÇϴ Ưº°ÇÑ Å°¿öµå°¡ ÀÖ½À´Ï´Ù. extern "C"·Î¼­ ¼±¾ðµÈ ÇÔ¼ö´Â Có·³ ÇÔ¼öÀÇ À̸§À» symbolÀÇ À̸§À¸·Î »ç¿ëÇÕ´Ï´Ù. ÀÌ·¯ÇÑ ÀÌÀ¯·Î, ¸â¹öÇÔ¼ö°¡ ¾Æ´Ñ ÇÔ¼öµé¸¸ÀÌ extern "C"·Î¼­ ¼±¾ðµÉ ¼ö ÀÖ°í, ÀÌ·¯ÇÑ ÇÔ¼öµéÀº ¿À¹ö·ÎµùÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù.

ÀÌ·± ½ÉÇÑ Á¦ÇÑÀÌ ÀÖÁö¸¸, extern "C"ÇÔ¼ö´Â C ÇÔ¼öó·³ dlopenÀ» ½á¼­ µ¿ÀûÀ¸·Î ÀûÀçÇÒ ¼ö Àֱ⠶§¹®¿¡ ¸Å¿ì À¯¿ëÇÕ´Ï´Ù.

ÀÌ°ÍÀº extern "C"·Î ¼±¾ðµÈ ÇÔ¼ö°¡ C++ Äڵ带 Æ÷ÇÔÇÒ ¼ö ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÏ´Â °ÍÀ̾ƴմϴÙ. ÀÌ·± ÇÔ¼ö´Â ¾î´À Á¾·ùÀÇ ÀÎÀÚ¶óµµ ¹ÞÀ» ¼ö ÀÖ°í, C++ÀÇ Æ¯Â¡À» ¾µ ¼ö ÀÖ½À´Ï´Ù.


3.2. ÇÔ¼ö¸¦ ÀûÀçÇÏ´Â ¹ý

C++¿¡¼­ ÇÔ¼ö´Â dlsymÀ» ÅëÇØ Có·³ ÀûÀçµË´Ï´Ù. ´ç½ÅÀÌ ÀûÀçÇÏ°íÀÚ ÇÏ´Â ÇÔ¼ö´Â symbolÀÇ À̸§ÀÌ ¾û¸ÁÀ¸·Î µÇÁö ¾Êµµ·Ï(name manglingÀÌ ÀÌ·ç¾îÁöÁö ¾Êµµ·Ï), extern "C"·Î¼­ÀÇ ÀÚ°ÝÀ» °®Ãç¾ß ÇÒ °ÍÀÔ´Ï´Ù.

예 1. ÇÔ¼ö¸¦ ÀûÀçÇϱâ

main.cpp:

#include <iostream>
#include <dlfcn.h>


int main() {
    using std::cout;
    using std::cerr;

    cout << "C++ dlopen demo\n\n";

    // open the library
    cout << "Opening hello.so...\n";
    void* handle = dlopen("./hello.so", RTLD_LAZY);
    
    if (!handle) {
        cerr << "Cannot open library: " << dlerror() << '\n';
        return 1;
    }
    
    // load the symbol
    cout << "Loading symbol hello...\n";
    typedef void (*hello_t)();
    hello_t hello = (hello_t) dlsym(handle, "hello");
    if (!hello) {
        cerr << "Cannot load symbol 'hello': " << dlerror() <<
            '\n';
        dlclose(handle);
        return 1;
    }
    
    // use it to do the calculation
    cout << "Calling hello...\n";
    hello();
    
    // close the library
    cout << "Closing library...\n";
    dlclose(handle);
}

hello.cpp:

#include <iostream>

extern "C" void hello() {
    std::cout << "hello" << '\n';
}

hello¶ó´Â ÇÔ¼ö´Â hello.cpp¿¡¼­ extern "C"·Î ¼±¾ðµÇ¾ú½À´Ï´Ù. ÀÌ°ÍÀº main.cpp¿¡¼­ dlsymÀ» »ç¿ëÇÏ¿© ÀûÀçÇÒ ¼ö ÀÖ½À´Ï´Ù. ÇÔ¼ö´Â extern "C" ·Î¼­ÀÇ ÀÚ°ÝÀ» °®Ãß¾î¾ß ÇÕ´Ï´Ù. ±×·¸Áö ¾Ê´Ù¸é ¿ì¸®´Â hello ÇÔ¼öÀÇ symbolÀÇ À̸§À» ¾Ë ¼ö ¾øÀ»Å״ϱî¿ä.

주의

extern "C"ÀÇ ¼±¾ð¿¡´Â µÎ°¡ÁöÀÇ ´Ù¸¥ ÇüÅ°¡ ÀÖ½À´Ï´Ù: Çϳª´Â À§¿¡¼­ ½è´øextern "C"ÀÇ ¹æ¹ýÀÌ°í, ¶Ç ´Ù¸¥ Çϳª´Â extern "C" { … }ÇüÅ·ΠÁß°ýÈ£ »çÀÌ¿¡ ¼±¾ðÀÌ µé¾î°¡´Â ¹æ¹ýÀÔ´Ï´Ù. ù¹ø°(inline)ÇüÅ´ extern ¿¬°á°ú C ¾ð¾î ¿¬°áÀ» °®½À´Ï´Ù. µÎ¹ø° ÇüÅ´ C¾ð¾î ¿¬°á¿¡¸¸ ¿µÇâÀ» ³¢Ä¨´Ï´Ù. µû¶ó¼­ ¾Æ·¡ÀÇ µÎ °¡Áö ¼±¾ð ¹æ¹ýÀº µ¿ÀÏÇÑ °ÍÀÔ´Ï´Ù.

extern "C" int foo;
extern "C" void bar();
            
extern "C" {
     extern int foo;
     extern void bar();
 }

extern°ú externÀÌ ¾Æ´Ñ ÇÔ¼öÀÇ ¼±¾ð¿¡´Â Â÷ÀÌ°¡ ¾ø±â¶§¹®¿¡, ´ç½ÅÀÌ ¾î¶°ÇÑ º¯¼öµµ ¼±¾ðÇÏÁö ¾Ê´Â ÇÑ ¹®Á¦°¡ ¾ø½À´Ï´Ù. ´ç½ÅÀÌ º¯¼ö¸¦ ¼±¾ðÇÑ´Ù¸é,´ÙÀ½ÀÇ µÎ ¼±¾ð ¹æ¹ýÀº °°Áö ¾Ê´Ù´Â °ÍÀ» ¸í½ÉÇØ¾ß ÇÕ´Ï´Ù.

extern "C" int foo;
extern "C" {
    int foo;
}

Á» ´õ ÀÚ¼¼ÇÑ ¼³¸íÀ» ¿øÇϽøé, paragraph 7¿¡ ÁÖÀǸ¦ ±â¿ï¿© [ISO14882]ÀÇ 7.5¸¦ Àо½Ã°Å³ª, [STR2000]ÀÇ paragraph 9.2.4.¸¦ ÂüÁ¶ÇØÁֽʽÿÀ.

¿ÜºÎ º¯¼ö·Î ¹«¾ð°¡¸¦ Çϱâ Àü¿¡, see alsoºÎºÐ¿¡ ÀûÇô ÀÖ´Â ¹®¼­µéÀ» Á¤µ¶ÇØÁֽñ⠹ٶø´Ï´Ù.


3.3. Ŭ·¡½º¸¦ ÀûÀçÇÏ´Â ¹ý

Ŭ·¡½º¸¦ ÀûÀçÇÏ´Â °ÍÀº Á» ´õ ¾î·Æ½À´Ï´Ù. ¿Ö³ÄÇÏ¸é ¿ì¸®´Â Ŭ·¡½ºÀÇÀνºÅϽº¸¦ ÇÊ¿ä·Î ÇÏÁö, ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÇÊ¿ä·Î ÇÏ´Â°Ô ¾Æ´Ï±â ¶§¹®ÀÔ´Ï´Ù.

Ŭ·¡½º°¡ ½ÇÇàÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖÁö ¾ÊÀºµ¥´Ù°¡,(¸î¸î »óȲ¿¡¼­´Â) Ŭ·¡½ºÀÇ À̸§Á¶Â÷µµ ¾Ë ¼ö ¾ø±â ¶§¹®¿¡, ¿ì¸®´Â new ¸¦ ÀÌ¿ëÇÏ¿© Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÒ ¼ö ¾ø½À´Ï´Ù.

ÀÌ°ÍÀº ´ÙÇü¼º(polymorphism) À» ÅëÇØ ÇØ°áÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿ì¸®´Â ±â¹Ý Ŭ·¡½º, °¡»óÀÇ ¸â¹ö¸¦ °¡Áö°í ÀÖ´Â ÀÎÅÍÆäÀ̽ºÅ¬·¡½º¸¦ ½ÇÇàÆÄÀϳ»¿¡ ¼±¾ðÇÏ°í, ½ÇÁ¦ ±¸ÇöºÎÀÇ Å¬·¡½º¸¦ ¸ðµâ ¿¡ ¼±¾ðÇÕ´Ï´Ù. ÀϹÝÀûÀ¸·Î ÀÎÅÍÆäÀ̽º Ŭ·¡½º´Â Ãß»óÀûÀÔ´Ï´Ù. (Ŭ·¡½º°¡ ¼ø¼ö°¡»óÇÔ¼ö(pure virtual function)À» °¡Áö°í ÀÖÀ»¶§ Ŭ·¡½º°¡ Ãß»óÀûÀ̶ó°í ÇÕ´Ï´Ù.)

Ŭ·¡½ºÀÇ µ¿ÀûÀÎ ÀûÀç´Â ÀϹÝÀûÀ¸·Î Ç÷¯±×ÀÎ — ¸íÈ®ÇÏ°Ô Á¤ÀÇµÈ ÀÎÅÍÆäÀ̽º¸¦ º¸¿©ÁÖ¾î¾ß ÇÏ´Â — ¿¡ ¾²À̱⠶§¹®¿¡, ¿ì¸®´Â ¾î·°Å³ª ÀÎÅÍÆäÀ̽º Ŭ·¡½º¿Í °Å±â¼­ ÆÄ»ýµÈ ±¸ÇöºÎ Ŭ·¡½º¸¦ Á¤ÀÇÇØ¾ß ÇÕ´Ï´Ù.

´ÙÀ½À¸·Î,¸ðµâ ¾È¿¡Class factory functionÀ̶ó´Â µÎ°³ÀÇ µµ¿òÀ» ÁÖ´Â ÇÔ¼ö¸¦ Ãß°¡·Î ¼±¾ðÇØ¾ß ÇÕ´Ï´Ù. ÀÌ ÇÔ¼ö Áß Çϳª´Â Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ¸¸µé°í ±×°ÍÀÇ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÏ´Â ¿ªÇÒÀ» ÇÏ°í, ¶Ç ´Ù¸¥ ÇϳªÀÇ ÇÔ¼ö´Â factory¿¡¼­ ¸¸µé¾îÁø ÇÔ¼öÀÇ Æ÷ÀÎÅ͸¦ ¹Þ¾Æ ±×°Í(Ŭ·¡½ºÀÇ ÀνºÅϽº)¸¦ Æı«ÇÏ´Â ¿ªÇÒÀ» ÇÕ´Ï´Ù. ÀÌ µÎ ÇÔ¼ö´Â extern "C"ÀÇ ÀÚ°ÝÀ» °¡Áö°í ÀÖ¾î¾ß ÇÕ´Ï´Ù.

Ŭ·¡½º¸¦ ¸ðµâ¿¡¼­ ¾²±â À§Çؼ­,µÎ°³ÀÇ factory functionÀ» ¿ì¸®°¡ helloÇÔ¼ö¸¦ ÀûÀçÇß´ø °Íó·³dlsymÀ» »ç¿ëÇÏ¿© ÀûÀçÇϽʽÿÀ.±×·³ ¿ì¸®´Â ¿ì¸®°¡ ¿øÇÏ´Â ¸¸Å­ÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÒ¼öµµ ÀÖ°í, Æı«ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

예 2. Ŭ·¡½º¸¦ ÀûÀçÇÏ´Â ¹ý

¿©±â¼­ ¿ì¸®´Â ÀϹÝÀûÀδٰ¢ÇüÀ» ÀÎÅÍÆäÀ̽º·Î ÇÏ°í, »ï°¢ÇüÀ» ±¸ÇöºÎºÐÀ¸·Î ÇÒ °ÍÀÔ´Ï´Ù.

main.cpp:

#include "polygon.hpp"
#include <iostream>
#include <dlfcn.h>

int main() {
    using std::cout;
    using std::cerr;

    // load the triangle library
    void* triangle = dlopen("./triangle.so", RTLD_LAZY);
    if (!triangle) {
        cerr << "Cannot load library: " << dlerror() << '\n';
        return 1;
    }

    // load the symbols
    create_t* create_triangle = (create_t*) dlsym(triangle, "create");
    destroy_t* destroy_triangle = (destroy_t*) dlsym(triangle, "destroy");
    if (!create_triangle || !destroy_triangle) {
        cerr << "Cannot load symbols: " << dlerror() << '\n';
        return 1;
    }

    // create an instance of the class
    polygon* poly = create_triangle();

    // use the class
    poly->set_side_length(7);
        cout << "The area is: " << poly->area() << '\n';

    // destroy the class
    destroy_triangle(poly);

    // unload the triangle library
    dlclose(triangle);
}

polygon.hpp:

#ifndef POLYGON_HPP
#define POLYGON_HPP

class polygon {
protected:
    double side_length_;

public:
    polygon()
        : side_length_(0) {}

    void set_side_length(double side_length) {
        side_length_ = side_length;
    }

    virtual double area() const = 0;
};

// the types of the class factories
typedef polygon* create_t();
typedef void destroy_t(polygon*);

#endif

triangle.cpp:

#include "polygon.hpp"
#include <cmath>

class triangle : public polygon {
public:
    virtual double area() const {
        return side_length_ * side_length_ * sqrt(3) / 2;
    }
};


// the class factories

extern "C" polygon* create() {
    return new triangle;
}

extern "C" void destroy(polygon* p) {
    delete p;
}

Ŭ·¡½º¸¦ ÀûÀçÇÒ¶§ ÁÖÀÇÇØ¾ß ÇÒ Á¡ÀÌ ¸î°¡Áö ÀÖ½À´Ï´Ù:

  • ´ç½ÅÀº ÀνºÅϽº¸¦ »ý¼ºÇÏ´Â ÇÔ¼ö¿Í Æı«ÇÏ´Â ÇÔ¼ö¸¦ ¸ðµÎ Á¦°øÇØ¾ß ÇÕ´Ï´Ù. ¶Ç ´ç½ÅÀÌ ÀνºÅϽº¸¦ Æı«ÇÒ¶§¿¡´Â ½ÇÇàÆÄÀÏ ³»¿¡¼­ delete¸¦ ÀÌ¿ëÇؼ­ Áö¿ìÁö ¸¶½Ã°í ,Ç×»ó ¸ðµâ·Î ³Ñ°Ü¼­ Áֽñ⠹ٶø´Ï´Ù. ÀÌ´Â C++ ¿¡¼­ new¿Í delete °¡ ¿À¹ö·Îµù µÉ ¼ö Àֱ⠶§¹®ÀÔ´Ï´Ù. ÀÌ °æ¿ì¿¡ ¼­·Î ¸ÂÁö ¾Ê´Â new¿Í delete °¡ È£ÃâµÉ ¼ö ÀÖ°í, ±×·¸°Ô µÇ¸é ¸Þ¸ð¸® ´©¼ö³ª segmentation fault°¡ ÀϾ ¼öµµ ÀÖ½À´Ï´Ù.ÀÌ°ÍÀº ¸ðµâ°ú ½ÇÇàÆÄÀÏÀ» ¸µÅ©ÇÒ¶§ ¼­·Î ´Ù¸¥ Ç¥ÁØ ¶óÀ̺귯¸®¸¦ »ç¿ëÇßÀ» °æ¿ì¿¡µµ Àû¿ëµË´Ï´Ù.

  • ÀÎÅÍÆäÀ̽º Ŭ·¡½ºÀÇ ¼Ò¸êÀÚ´Â ±¸ÇöºÎ Ŭ·¡½º¿¡ ¼Ò¸êÀÚ°¡ ¾ø´Â°æ¿ì¸¦ Á¦¿ÜÇÏ°í´Â °¡»ó(virtual)À̾î¾ß ÇÕ´Ï´Ù. ±×·¸Áö ¾ÊÀ¸¸é ±×°ÍÀº È£ÃâµÇÁö ¾ÊÀ» °ÍÀÌ°í, ¸Þ¸ð¸® ´©¼ö³ª segmentation fault°¡ ÀϾ ¼öµµ ÀÖ½À´Ï´Ù.


4. See Also

  • dlopen(3)ÀÇ ¸Å´º¾ó ÆäÀÌÁö¸¦ º¸½Ê½Ã¿À. dlopenAPIÀÇ ¸ñÀû°ú ¿ëµµ¸¦ ¼³¸íÇÕ´Ï´Ù.

  • James Norton ¾¾°¡ Linux Journal¿¡ ±â°íÇß´ø ±Û Dynamic Class Loading for C++ on Linux

  • extern "C", »ó¼Ó, °¡»óÇÔ¼ö, new ¿Í delete¿¡ ´ëÇØ ³ª¿ÍÀÖ´Â ´ç½ÅÀÌ Áñ°Üº¸´Â C++ reference. Àü [STR2000]À» ÃßõÇÕ´Ï´Ù.

  • [ISO14882]

  • Program Library HOWTO¿¡¼­´Â ´ç½Å¿¡°Ô Á¤Àû, °øÀ¯,µ¿ÀûÀûÀç ¶óÀ̺귯¸®¿Í ±×·¯ÇÑ °ÍµéÀ» ¸¸µå´Â ¹æ¹ýÀ» ¼³¸íÇØ ÁÙ °ÍÀÔ´Ï´Ù. (¹ø¿ªµÈ ¹®¼­´Â http://kldp.org/HOWTO/html/Program-Library-HOWTO/ ¿¡¼­ º¼ ¼ö ÀÖ´Ù.)


서지사항

ISO14482 ISO/IEC 14482-1998 — The C++ Programming Language. http://webstore.ansi.org/¿¡¼­ PDF·Î ÀÌ¿ë°¡´ÉÇÕ´Ï´Ù.

STR2000 Stroustrup Bjarne The C++ Programming Language, Special Edition. ISBN 0-201-70073-5. Addison-Wesley.


ID
Password
Join
Let him who takes the Plunge remember to return it by Tuesday.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2003-08-10 11:52:29
Processing time 0.0020 sec