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

You are not allowed to 'Keywords'


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
You will receive a legacy which will place you above want.


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.0015 sec