C++ dlopen mini HOWTO±è°æÅ dlopen API¸¦ ÀÌ¿ëÇÏ¿©
µ¿ÀûÀ¸·Î C++ ÇÔ¼ö¿Í Ŭ·¡½º¸¦ ÀûÀçÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.
고친 과정 |
---|
고침 1.00 | 2002-06-19 | 고친이 AI | copyright¿Í licenseºÎºÐÀ» ¾ÕÂÊÀ¸·Î ¿Å°å´Ù.
¿ë¾î¿¡ °üÇÑ ºÎºÐÀ» Ãß°¡Çß´Ù. ¾à°£ º¯È°¡ ÀÖ¾ú´Ù. | 고침 0.97 | 2002-06-19 | 고친이 JYG | ¹®Àå°ú ¹®¹ýÀ» ¾à°£ °¡´Ùµë¾ú´Ù. | 고침 0.96 | 2002-06-12 | 고친이 AI | Âü°í ¹®ÇåÀ» Ãß°¡Çß´Ù. ¿ÜºÎ ÇÔ¼ö¿Í º¯¼öµéÀÇ ¼³¸íÀ»
¼öÁ¤Çß´Ù. | 고침 0.95 | 2002-06-11 | 고친이 AI | ¾ÆÁÖ ¾à°£ °³¼±. | 고침 0.9 | 2002-06-10 | 고친이 AI | ÃÊ¾È ÀÛ¼º. |
Unix C++ ÇÁ·Î±×·¡¸Ó »çÀÌ¿¡¼ ÀÚÁÖ ¹ß»ýÇÏ´Â Áú¹®Àº
dlopen API¸¦ ÀÌ¿ëÇÏ¿© C++ ÇÔ¼ö¿Í
Ŭ·¡½º¸¦ ÀûÀçÇÏ´Â ¹æ¹ý¿¡ °üÇÑ °ÍÀÔ´Ï´Ù.
»ç½Ç ÀÌ°ÍÀº Ç×»ó °£´ÜÇÑ °Í¸¸Àº ¾Æ´Ï±â ¶§¹®¿¡,¾à°£ÀÇ ¼³¸íÀÌ
ÇÊ¿äÇÕ´Ï´Ù. ÀÌ mini HOWTO¿¡¼ ±×°Í¿¡ °üÇÑ ³»¿ëÀ» ´Ù·ç°í ÀÖ½À´Ï´Ù.
ÀÌ ¹®¼¸¦ ÀÌÇØÇϱâ À§Çؼ´Â C,
C++,±×¸®°ídlopen
API ¿¡ ´ëÇؼ ¾î´À Á¤µµ ¾Ë°í ÀÖ¾î¾ß ÇÒ °ÍÀÔ´Ï´Ù.
ÀÌ HOWTOÀÇ ¿ø¹®Àº http://www.isotton.com/howtos/C++-dlopen-mini-HOWTO/¿¡ ÀÖ½À´Ï´Ù.
ÀÌ ¹®¼ C++ dlopen mini HOWTOÀÇ ÀúÀÛ±ÇÀº
Aaron Isotton ¿¡°Ô ÀÖ½À´Ï´Ù.
ÀÚÀ¯ ¼ÒÇÁÆ®¿þ¾î Àç´Ü¿¡¼ ¹ßÇ¥ÇÑ, 1.1 ȤÀº ±× ÀÌÈÄ ¹öÀüÀÇ
GNU Free Documentation LicenseÀÇ Á¶Ç׿¡ µû¶ó
ÀÌ ¹®¼¸¦ º¹»çÇϰųª, ¹èÆ÷ ȤÀº º¯°æÇÏ´Â °ÍÀÌ Çã¿ëµË´Ï´Ù.
ÀÌ ¹®¼ÀÇ ³»¿ëÀ¸·Î ÀÎÇÑ Ã¥ÀÓÀº ÁöÁö ¾Ê½À´Ï´Ù.
¿©±â¿¡ ¾²¿©Áø °³³äÀ̳ª ¿¹Á¦ ±×¸®°í Á¤º¸¸¦ »ç¿ëÇÏ¿© ¹ß»ýÇÑ
¹®Á¦¿¡ ´ëÇÑ Ã¥ÀÓÀº ¸ðµÎ ´ç½ÅÀÇ Ã¥ÀÓÀÔ´Ï´Ù.
¿©±â¿¡´Â ´ç½ÅÀÇ ½Ã½ºÅÛ¿¡ ÇÇÇظ¦ ÁÙ ¼ö ÀÖ´Â
¿À·ù³ª ºÎÁ¤È®ÇÑ °ÍµéÀÌ ÀÖÀ»¼öµµ ÀÖ½À´Ï´Ù.
ÁÖÀÇÇÏ¿© Áֽñ⠹ٶó¸ç, Àú´Â ¿©±â¿¡ ¾î¶°ÇÑ Ã¥ÀÓµµ ÁöÁö ¾ÊÀ»
°ÍÀÔ´Ï´Ù.
¸ðµç ÀúÀÛ±ÇÀº ±¸Ã¼ÀûÀ¸·Î ¾ð±ÞÇÏÁö ¾Ê¾Ò´Ù¸é, ±×°Íµé °¢°¢ÀÇ ¼ÒÀ¯ÀÚ°¡ °¡Áö°í ÀÖ½À´Ï´Ù.
ÀÌ ¹®¼¿¡ ÀÖ´Â ¿ë¾îÀÇ »ç¿ëÀÌ ¾î´À µî·Ï»óÇ¥³ª ¼ºñ½º ¸¶Å©ÀÇ È¿·Â¿¡ ¿µÇâÀ» ³¢Ä¡´Â
°ÍÀ¸·Î °£ÁÖÇؼ´Â ¾È µË´Ï´Ù. Ưº°ÇÑ Á¦Ç°À̳ª ºê·£µå¸¦ Áö¸íÇÏ´Â °ÍÀÌ
»óÇ°µîÀÇ ÃßõÀ¸·Î º¸¿©¼´Â ¾È µË´Ï´Ù.
ÀÌ ¹®¼¿¡¼, ³ª´Â ÀÌ ºÐµé²² °¨»çÇÏ°Ô µÇ¾î ±â»Ú°Ô »ý°¢ÇÕ´Ï´Ù.
Joy Y Goodreau ¾¾<joyg (at) us.ibm.com>
´Â ±³Á¤¿¡ µµ¿òÀ» Áּ̽À´Ï´Ù. D. Stimitis ¾¾<stimitis (at) idcomm.com>
´Â formatting °ú name mangling¿¡ ´ëÇÑ ¸î°¡Áö À̽´¸¦
ÁöÀûÇØÁּ̰í, extern "C"¿¡ ´ëÇÑ ¸î°¡Áö
³ÇØÇÑ Á¡À» ÁöÀûÇØÁּ̽À´Ï´Ù.
ÀÌ ¹®¼¿¡ ´ëÇÑ ¹ÝÀÀÀº ¾ðÁ¦³ª ȯ¿µÀÔ´Ï´Ù.
´ç½ÅÀÌ Ãß°¡ÇßÀ¸¸é ÇÏ´Â °Í, ÀÇ°ß, ºñÆÇÀ» ´ÙÀ½ ÁÖ¼Ò·Î º¸³»Áֽñâ
¹Ù¶ø´Ï´Ù <aaron@isotton.com> .
dlopen APIdlclose , dlerror ,
dlopen ,±×¸®°í dlsym ÇÔ¼ö´Â
dlopen(3) ¸Å´º¾ó ÆäÀÌÁö¿¡¼ ¼³¸íÇÏ°í ÀÖ½À´Ï´Ù.
ÀÌ ±Û¿¡¼"dlopen "À̶ó°í ½èÀ» ¶§´Â,
dlopen ÇÔ¼ö Çϳª¸¦ ÁöĪÇÏ´Â °ÍÀÌ°í,
"dlopen API" ¶ó°í ½èÀ» ¶§¿¡´Â,
API Àüü¸¦ ÁöĪÇÏ´Â °ÍÀÔ´Ï´Ù.
ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ¶§, ¶óÀ̺귯¸®¸¦ ÀûÀçÇØ¾ß ÇÒ ¶§°¡ °¡²û¾¿ ÀÖÀ» °ÍÀÔ´Ï´Ù.
´ç½ÅÀÌ ÇÁ·Î±×·¥¿¡ µé¾î°¡´Â Ç÷¯±×ÀÎÀ̳ª ¸ðµâÀ» ¸¸µé°í ÀÖÀ»¶§ ÀÌ·¯ÇÑ
ÀÏÀº Á¾Á¾ ¹ß»ýÇÕ´Ï´Ù.
C¾ð¾î¿¡¼, µ¿ÀûÀ¸·Î ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ´Â °ÍÀº ¸Å¿ì °£´ÜÇÕ´Ï´Ù.
(dlopen , dlsym ±×¸®°í
dlclose ¸¦ È£ÃâÇÏ´Â °Í¸¸À¸·Î ÃæºÐÇÕ´Ï´Ù)
C++¿¡¼´Â ¾à°£ ´õ º¹ÀâÇÕ´Ï´Ù. C++ ¶óÀ̺귯¸®¸¦ µ¿ÀûÀ¸·Î ÀûÀçÇÏ´Â °ÍÀÌ
¾î·Á¿î ÀÌÀ¯Áß¿¡ ÀϺκÐÀºname
mangling ¶§¹®ÀÌ°í, ÀϺκÐÀº dlopen API°¡
C¸¦ ¿°µÎ¿¡ µÎ°í ¸¸µé¾îÁ³±â ¶§¹®¿¡ class¸¦ ÀûÀçÇÏ´Â Àû´çÇÑ ¹æ¹ýÀ»
Á¦°øÇÏÁö ¸øÇϱ⠶§¹®ÀÔ´Ï´Ù.
C++¿¡¼ ¶óÀ̺귯¸®¸¦ ÀûÀçÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¼³¸íÇϱâ Àü¿¡,
name mangling¿¡ ´ëÇؼ ÀÚ¼¼È÷ »ìÆ캸°í, ¹®Á¦¸¦ ºÐ¼®ÇØ º¾½Ã´Ù.
ºñ·Ï ´ç½ÅÀÌ 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 À» ÅëÇØ ±× ÇÔ¼ö¸¦ ÀûÀçÇÒ ¼ö ÀÖ°Ô µÈ´Ù°í Çصµ),
±×°ÍÀº ¾Æ¸¶ ±× ƯÁ¤ÇÑ ÄÄÆÄÀÏ·¯¿¡¼¸¸ È¿°ú°¡ ÀÖÀ» °ÍÀÌ°í, ´ÙÀ½ ¹öÀüÀÇ ÄÄÆÄÀÏ·¯¿¡¼´Â ÀÌ¹Ì »ç¿ëÇÒ ¼ö ¾øÀ»Áöµµ
¸ð¸¨´Ï´Ù.
dlopen API ÀÇ ¶Ç´Ù¸¥ ¹®Á¦´Â, À̵éÀÌÇÔ¼ö¸¦ ÀûÀçÇÏ´Â °Í¸¸À» Áö¿øÇÏ°í ÀÖ´Ù´Â Á¡ÀÔ´Ï´Ù.
ÇÏÁö¸¸ C++¿¡¼´Â ¶óÀ̺귯¸®°¡ Á¾Á¾ ´ç½ÅÀÌ ÇÁ·Î±×·¥¿¡¼ ¾²°íÀÚ ÇÏ´Â Class¸¦ ³ëÃâ½ÃÅ°°í´Â ÇÕ´Ï´Ù.
ºÐ¸íÈ÷, Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ ´ç½ÅÀº ±×°ÍÀÇ ÀνºÅϽº¸¦ ¸¸µé¾î¾ß ÇÏÁö¸¸, ±×°ÍÀº ½±Áö ¾Ê½À´Ï´Ù.
C++¿¡´Â extern "C"¶ó´Â, C bindingÀ¸·Î ÇÔ¼ö¸¦
Á¤ÀÇÇϴ Ưº°ÇÑ Å°¿öµå°¡ ÀÖ½À´Ï´Ù.
extern "C"·Î¼ ¼±¾ðµÈ ÇÔ¼ö´Â Có·³ ÇÔ¼öÀÇ À̸§À» symbolÀÇ À̸§À¸·Î »ç¿ëÇÕ´Ï´Ù.
ÀÌ·¯ÇÑ ÀÌÀ¯·Î, ¸â¹öÇÔ¼ö°¡ ¾Æ´Ñ ÇÔ¼öµé¸¸ÀÌ extern "C"·Î¼ ¼±¾ðµÉ ¼ö ÀÖ°í,
ÀÌ·¯ÇÑ ÇÔ¼öµéÀº ¿À¹ö·ÎµùÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ·± ½ÉÇÑ Á¦ÇÑÀÌ ÀÖÁö¸¸, extern "C"ÇÔ¼ö´Â C ÇÔ¼öó·³
dlopen À» ½á¼ µ¿ÀûÀ¸·Î ÀûÀçÇÒ ¼ö Àֱ⠶§¹®¿¡ ¸Å¿ì À¯¿ëÇÕ´Ï´Ù. ÀÌ°ÍÀº extern "C"·Î ¼±¾ðµÈ ÇÔ¼ö°¡
C++ Äڵ带 Æ÷ÇÔÇÒ ¼ö ¾ø´Ù´Â °ÍÀ» ÀǹÌÇÏ´Â °ÍÀ̾ƴմϴÙ.
ÀÌ·± ÇÔ¼ö´Â ¾î´À Á¾·ùÀÇ ÀÎÀÚ¶óµµ ¹ÞÀ» ¼ö ÀÖ°í, C++ÀÇ Æ¯Â¡À» ¾µ ¼ö ÀÖ½À´Ï´Ù.
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°ú externÀÌ ¾Æ´Ñ
ÇÔ¼öÀÇ ¼±¾ð¿¡´Â Â÷ÀÌ°¡ ¾ø±â¶§¹®¿¡,
´ç½ÅÀÌ ¾î¶°ÇÑ º¯¼öµµ ¼±¾ðÇÏÁö ¾Ê´Â ÇÑ ¹®Á¦°¡ ¾ø½À´Ï´Ù.
´ç½ÅÀÌ º¯¼ö¸¦ ¼±¾ðÇÑ´Ù¸é,´ÙÀ½ÀÇ µÎ ¼±¾ð ¹æ¹ýÀº
°°Áö ¾Ê´Ù´Â °ÍÀ» ¸í½ÉÇØ¾ß ÇÕ´Ï´Ù.
Á» ´õ ÀÚ¼¼ÇÑ ¼³¸íÀ» ¿øÇϽøé, paragraph 7¿¡ ÁÖÀǸ¦ ±â¿ï¿©
[ISO14882]ÀÇ 7.5¸¦ Àо½Ã°Å³ª,
[STR2000]ÀÇ paragraph 9.2.4.¸¦ ÂüÁ¶ÇØÁֽʽÿÀ.
¿ÜºÎ º¯¼ö·Î ¹«¾ð°¡¸¦ Çϱâ Àü¿¡,
see alsoºÎºÐ¿¡
ÀûÇô ÀÖ´Â ¹®¼µéÀ» Á¤µ¶ÇØÁֽñ⠹ٶø´Ï´Ù.
|
Ŭ·¡½º¸¦ ÀûÀçÇÏ´Â °ÍÀº Á» ´õ ¾î·Æ½À´Ï´Ù. ¿Ö³ÄÇϸé
¿ì¸®´Â Ŭ·¡½ºÀÇÀνºÅϽº¸¦ ÇÊ¿ä·Î ÇÏÁö,
ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÇÊ¿ä·Î ÇÏ´Â°Ô ¾Æ´Ï±â ¶§¹®ÀÔ´Ï´Ù.
Ŭ·¡½º°¡ ½ÇÇàÆÄÀÏ¿¡ Á¤ÀǵǾî ÀÖÁö ¾ÊÀºµ¥´Ù°¡,(¸î¸î »óȲ¿¡¼´Â)
Ŭ·¡½ºÀÇ À̸§Á¶Â÷µµ ¾Ë ¼ö ¾ø±â ¶§¹®¿¡, ¿ì¸®´Â 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°¡ ÀϾ ¼öµµ
ÀÖ½À´Ï´Ù.
STR2000
Stroustrup Bjarne
The C++ Programming Language, Special
Edition.
ISBN 0-201-70073-5.
Addison-Wesley.
|
|