ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. 1 ÀÌÀ¯
´Ù¾çÇÑ ¾ÖÇø®ÄÉÀ̼ǿ¡ »ç¿ë°¡´ÉÇÑ ·Î±×ºÐ¼® ÇÁ·Î±×·¥À» ¸¸µé·Á°í ÇÑ´Ù. ÀÌ·¯ÇÑ ÇÁ·Î±×·¥ÀÇ °æ¿ì ¾î¶² ¾ÖÇø®ÄÉÀ̼ǿ¡¼ »ç¿ëÇÒÁö ¾Ë ¼ö ¾ø±â ¶§¹®¿¡, ¿øº»¼Ò½º¿¡´Â ¼öÁ¤ÇÒ ÇÊ¿ä ¾øÀÌ ·Î±×ºÐ¼® ¾Ë°í¸®Áò¸¸ ÀûÀç°¡´ÉÇϵµ·Ï ¸¸µé Çʿ䰡 ÀÖ´Ù.
°¡ÀåÁÁÀº ¹æ¹ýÀº main ÄÚµå¿Í ¾Ë°í¸®ÁòÀ» ºÐ¸®½ÃŰ´Â °ÍÀ¸·Î, À̰ÍÀº ¶óÀ̺귯¸®ÀÇ µ¿ÀûÀûÀ縦 ÀÌ¿ëÇØ¼ ´Þ¼º°¡´É ÇÏ´Ù. µ¿ÀûÀûÀç´Â ¶óÀ̺귯¸®¹®¼¿¡ ¾ð±ÞµÇ¾î ÀÖ´Ù.
Áï ¾Ë°í¸®ÁòÀ» Ç÷¯±×ÀÎ ÇüÅ·ΠÀûÀçÇÏ´Â ±â¼úÀε¥, ¿©±â¿¡ ´õÇØ¼ C++ÀÇ Å¬·¡½º¸¦ µ¿ÀûÀ¸·Î ÀûÀç½Ãų ¼ö Àֱ⸦ ¿øÇß´Ù. ±×·¸´Ù¸é, Ŭ·¡½ºÀÇ Ãß»óȸ¦ ÀÌ¿ëÇØ¼, Á»´õ ÀϰüµÈ °³¹ßÀÚ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÒ ¼ö ÀÖÀ» °ÍÀ̱⠶§¹®ÀÌ´Ù.
±×·¯¹Ç·Î ´ÙÀ½ÀÇ µÎ°¡Áö¸¦ ´Þ¼ºÇÏ´Â°Ô ÁÖ¿ä ¸ñÇ¥°¡ µÉ °ÍÀÌ´Ù.
2 C++·Î ÀÛ¼ºµÈ ¶óÀ̺귯¸®»ç¿ëÀÇ ¹®Á¦
C++¿¡¼ Ŭ·¡½ºÀÇ µ¿ÀûÀûÀç °¡´É¼º¿¡ ´ëÇØ »ý°¢ÇØ º»´Ù.
C¿¡¼ÀÇ ¶óÀ̺귯¸®ÀÇ µ¿ÀûÀûÀç´Â ¸í·áÇÏ´Ù. ÀÌ¿¡ ´ëÇÑ ³»¿ëÀº ¶óÀ̺귯¸®¸¸µé±â ¹®¼¸¦ Âü°íÇÑ´Ù.
C++¿¡¼´Â name mangling ¶§¹®¿¡ dlopen()À» ÀÌ¿ëÇØ¼ ¶óÀ̺귯¸®¸¦ ÀûÀçÇϴµ¥, ¾î·Á¿òÀÌ ÀÖ´Ù. ¾Ö½Ã´çÃÊ dlopen()ÀÌ C++À» ¿°µÎ¿¡ µÎÁö ¾Ê°í ¸¸µé¾ú´Ù´Â °Íµµ ¹®Á¦ÀÏ °ÍÀÌ´Ù.
C¿Í C++Àº ÇÔ¼ö¸¦ °¡¸®Å°±âÀ§ÇÑ symbol Å×À̺íÀ» °¡Áö°í ÀÖ´Ù. ¾î¶² ÇÔ¼ö¸¦ È£ÃâÇϸé symbol Å×À̺íÀ» µÚÁ®¼, ÀÌÁøÆÄÀÏ ³»¿¡¼ ÇÔ¼öÀÇ ¿øº»ÀÇ À§Ä¡¸¦ ¾Ë¾Æ³»¾î¼ ÀоîµéÀÌ°í ½ÇÇàÇÏ´Â °ÍÀ¸·Î ¹¦»çÇÒ ¼ö ÀÖ´Ù.
C´Â symbolÀÌ ÇϳªÀÇ ÇÔ¼ö¿Í ´ëÀÀÇÑ´Ù. ±×·¸Áö¸¸ C++Àº overloadingÀ¸·Î ÀÎÇÏ¿©¼, ÇÔ¼öÀ̸§°ú ½Éº¼ÀÌ ÀÏÄ¡ÇÏÁö ¾Ê´Â °æ¿ì°¡ ¹ß»ýÇÑ´Ù. À̸§Àº °°Áö¸¸ ÀÎÀÚ°¡ ´Ù¸¥ ÇÔ¼ö°¡ ´ëÇ¥ÀûÀÎ °æ¿ì´Ù. ±×·¯¹Ç·Î, C++·Î °øÀ¯¶óÀ̺귯¸®¸¦ ¸¸µé°íÀÚ ÇÒ°æ¿ì, ÀÌ ÇÔ¼ö´Â ¹Ýµå½Ã À¯ÀÏÇÏ´Ù´Â °ÍÀ» ÄÄÆÄÀÏ·¯¿¡°Ô ¾Ë·ÁÁÙ Çʿ䰡 ÀÖ´Ù. 3 extern "C" ¸¦ ÀÌ¿ëÇÑ ÇØ°á
¿À¹ö·ÎµùÀ¸·Î ÀÎÇØ¼ ¹ß»ýÇÏ´Â ¹®Á¦´Â extern "C"¸¦ ÀÌ¿ëÇϸé ÇØ°áÇÒ ¼ö ÀÖ´Ù. extern "C" ´Â ÇØ´ç ÇÔ¼ö°¡ ½Éº¼À̸§°ú ÀÏÄ¡µÉ °ÍÀ̶ó´Â °ÍÀ» ¾Ë·ÁÁØ´Ù. À̸¦Å׸é C ÇÔ¼ö¿Í ¸¶Âù°¡Áö·Î »ç¿ëÇϰڴٴ Àǹ̴Ù. ´ë½Å C++ÀÇ ±â´ÉÀÎ overloadµîÀº »ç¿ëÇÒ ¼ö ¾ø°Ô µÈ´Ù.
¿¹ÄÁµ¥ hello¶õ ÇÔ¼ö°¡ ÀÖ´Ù¸é, ´ÙÀ½°ú °°ÀÌ extern "C"¸¦ ÀÌ¿ëÇØ¼ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. #include <iostream> using namespace std; extern "C" void hello() { cout << "hello" << "\n"; } 4 classÀÇ µ¿ÀûÀûÀç
exern "C"¸¦ ÀÌ¿ëÇØ¼, ¿À¹ö·ÎµùÀÌ ÇÊ¿ä¾ø´Â ÇÔ¼ö¸¦ ÀûÀç½ÃŰ´Â ¹ý¿¡ ´ëÇØ¼ ¾Ë¾ÆºÃ´Ù. ±×·¸´Ù¸é, class´Â ¾î¶³±î.
¾ÈŸ±õ°Ôµµ class´Â dlopen()À» ÀÌ¿ëÇØ¼ È£ÃâÇÒ ¼ö°¡ ¾ø´Ù. ¾ÖÃÊ¿¡ dlopenÀÌ class¸¦ ¿°µÎ¿¡ µÎ°í ¸¸µé¾îÁø°Ô ¾Æ´Ï±â ¶§¹®ÀÌ´Ù. °¡Àå ÀϹÝÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀº class¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ³Ñ°ÜÁÖ´Â factory ÇÔ¼ö¸¦ ¸¸µé°í, ÀÌ Æ÷ÀÎÅ͸¦ ÀÌ¿ëÇØ¼ ¸Þ¼µå¸¦ È£ÃâÇÏ´Â ¹æ¹ýÀÏ °ÍÀÌ´Ù.
´ÙÀ½Àº factory ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ Ŭ·¡½º¸¦ È£ÃâÇÏ´Â ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù. ÇÁ·Î±×·¥À̸§Àº main.cc·Î ÇϰڴÙ. #include <dlfcn.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include "mymodule1.h" int main(int argc, char **argv) { void *handle; char *error; Test *LTest; handle = dlopen("libmymodule.so", RTLD_LAZY); if (!handle) { perror("Open Library\n"); exit(0); } // Func_Init init_t* init_myFunc = (init_t *)dlsym(handle, "Func_Init"); if ((error = dlerror()) != NULL) { printf("ERROR : %s\n",error); exit(0); } LTest = init_myFunc(); LTest->Count(); LTest->Count(); LTest->Print(); // Func_destory destroy_t *destroy_myFunc = (destroy_t *)dlsym(handle, "Func_destory"); destroy_myFunc(LTest); }
mymodule1.h·Î class Test°¡ ¼±¾ðµÇ¾î ÀÖ´Ù. 001 #ifndef _MYMODULE_H_
002 #define _MYMODULE_H_
003
004 #include <stdio.h>
005 #include <string>
006
007 using namespace std;
008
009 class Test
010 {
011 private:
012 int count;
013 public:
014 Test();
015 ~Test()
016 {
017 printf("Destory\n");
018 }
019 void Count();
020 void Print();
021 };
022 extern "C" class Test* Func_Init();
023 extern "C" void Func_destory(class Test *aTest);
024
025 typedef void destroy_t(Test*);
026 typedef Test* init_t();
027 #endif
028
Funic_init¿Í Func_destory¶ó´Â factory ÇÔ¼ö°¡ ¼±¾ðµÇ¾îÀÖ´Ù.
´ÙÀ½Àº Test Ŭ·¡½º¿Í factory ÇÔ¼ö°¡ Á¤ÀǵǾî ÀÖ´Â ÄÚµå·Î ÆÄÀϸíÀº mymodule1.cc´Ù. #include "mymodule1.h"
Test::Test()
{
printf("Init\n");
count=0;
}
void Test::Count()
{
count++;
}
void Test::Print()
{
printf("Count is %d\n", count);
}
class Test* Func_Init()
{
Test *myTest;
myTest = new Test;
return myTest;
}
void Func_destory(class Test *aTest)
{
delete aTest;
}
void Func_Test(class Test *aTest)
{
aTest->Count();
aTest->Print();
}
´ÙÀ½Àº ÄÄÆÄÀÏ ¹æ¹ýÀÌ´Ù. ¸ÕÀú mymodule1.cc¸¦ °øÀ¯¶óÀ̺귯¸®ÇüÅ·ΠÄÄÆÄÀÏ ÇÑ´Ù. # g++ -fPIC -c mymodule1.cc # g++ -shared -W1,-soname,libmymodule.so.1 -o libmymodule.so.1.0.1 mymodule1.o
main.cc¸¦ ÄÄÆÄÀÏ ÇÑ´Ù. g++ -o main main.c -ldl -lmymoduleÀϹÝÀûÀÎ µ¿ÀûÀûÀçÀÇ °æ¿ì ÇÔ¼ö¿øÇüÀÌ ÇÊ¿ä ¾øÁö¸¸ classÀÇ °æ¿ì¿¡´Â ¸Þ¼µå¸¦ È£ÃâÇØ¾ß Çϱ⠶§¹®¿¡ -l¿É¼ÇÀ» ÀÌ¿ëÇØ¼ ¸Þ¼µå¿¡ ´ëÇÑ Á¤Àǰ¡ ÀÖ´Â ¶óÀ̺귯¸® ¸í½ÃÀûÀ¸·Î Áö½ÃÇØÁà¾ß ÇÑ´Ù.
¸¸µé¾îÁø ÇÁ·Î±×·¥À» ½ÇÇà½ÃÄÑ º¸ÀÚ. $ ./main Init Count is 2 DestoryÁ¦´ë·Î ½ÇÇàµÊÀ» ¾Ë ¼ö ÀÖ´Ù. 5 ´ÙÇü¼ºÀÇ ±¸Çö
factory ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ Ŭ·¡½º¸¦ ·ÎµùÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» Å͵æÇßÀ¸´Ï, ÀÌÁ¦ ·Î±×ºÐ¼® ÇÁ·Î±×·¥ Á¦ÀÛ¿¡ ´ëÇÑ °èȹÀ» ¼¼¿öº¸±â·Î ÇÏÀÚ.
ÀÌ ·Î±×ºÐ¼® ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°Àº »çÇ×µéÀ» ¸¸Á·½ÃÄÑ¾ß ÇÑ´Ù.
2¹ø ¿ä±¸»çÇ×Àº Ŭ·¡½º¸¦ ÀûÀç½Ã۰í, Ŭ·¡½ºÀÇ ¸Þ¼µå¸¦ °¡»óÇÔ¼öÈ ÇÏ´Â °ÍÀ¸·Î ´Þ¼ºÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÀÏÁ¾ÀÇ Interface Ŭ·¡½º¸¦ ¸¸µé°í, °³¹ßÀÚ´Â InterfaceÀÇ ¸Þ¼µå¸¦ ±¸ÇöÇÏ´Â ¹æ½ÄÀ¸·Î ÇÊ¿äÇÑ ¸ðµâÀ» °³¹ßÇÏ´Â °ÍÀÌ´Ù. 6 ¿¹Àü ¹æ½Ä ±¸Çö
¿¹Àü¿¡µµ ·Î±×ºÐ¼® ºñ½º¹«·¹ÇÑ ÇÁ·Î±×·¥À» ¸¸µé¾ú´ø ÀûÀÌ ÀÖ´Ù. º¸¾È·Î±×ºÐ¼®ÇÁ·Î±×·¥ÀÌ¿´´Âµ¥, º¸¾ÈÀåºñ·Î ºÎÅÍ syslog, snmp ȤÀº Àü¿ë socketÀ¸·Î ºÎÅÍ º¸¾È·Î±×¸¦ ¹Þ¾Æ¼ ºÐ¼®Çϰí, À̺¥Æ®¸¦ »ý¼ºÇÏ´Â ÇÁ·Î±×·¥ÀÌ¿´´Ù. ±âº»°³³äÀº DOS °ø°Ý°Ë»ç ÇÁ·Î±×·¥ÀÇ Á¦ÀÛ¿¡ ¼Ò°³µÈ ¹Ù°¡ ÀÖ´Ù.
±âº» ½Ã½ºÅÛ/³×Æ®¿öÅ© ±¸¼ºÀº ´ÙÀ½°ú °°´Ù. ![]()
º¸¾ÈÀåºñ´Â ´Ù¾çÇÑ Á¾·ùÀÇ º¸¾È¼ÒÇÁÆ®¿þ¾î°¡ ¼³Ä¡µÇ¾î ÀÖÀ¸¸ç, ·Î±× ¶ÇÇÑ ÀüÇôÇ¥ÁØÈ µÇ¾î ÀÖÁö ¾ÊÀ¸¸ç, ³ª¸§´ë·ÎÀÇ Á¤Ã¥À» °¡Áö°í ¸¸µé¾îÁø´Ù. ¸¸¾à »õ·Î¿î Àåºñ°¡ Ãß°¡µÈ´Ù¸é, ºÐ¼®¼ÒÇÁÆ®¿þ¾î´Â ÇØ´ç ÀåºñÀÇ º¸¾È·Î±×¸¦ ºÐ¼®ÇÒ ¼ö ÀÖ´Â ±â´ÉÀÌ Ãß°¡µÇ¾î¾ß ÇÑ´Ù.
ÀÌ ÇÁ·Î±×·¥Àº ´ÙÀ½ÀÇ Á¶°ÇÀ» ¸¸Á·ÇÒ ¼ö ÀÖ¾î¾ß Çß´Ù.
ÀÌ ¹æ½ÄÀº ¸¸Á·½ÃÄѾßÇÒ Á¶°ÇÁß 1¹ø°ú 2¹øÀº ¾î´ÀÁ¤µµ ¸¸Á·½Ãų ¼ö ÀÖÁö¸¸, 3¹øÀ» ¸¸Á·½ÃŰÁö´Â ¸øÇß´Ù. Äڵ尡 °´Ã¼ÁöÇâÀûÀÌÁö ¾Ê¾Ò±â ¶§¹®¿¡, Áï C·Î °³¹ßµÇ¾ú±â ¶§¹®ÀÌ´Ù. ¹°·Ð Á»´õ ³ë·Â°ú ½Ã°£À» µé¿´´Ù¸é, 3¹øÀ» ¸¸Á·½Ãų ¼ö ÀÖ´Â ÇÁ·Î±×·¥ÀÇ Á¦ÀÛÀÌ °¡´ÉÇß°ÚÁö¸¸, ±×¶§´Â ±×·²¸¸ÇÑ ½Ç·ÂÀ» °®ÃßÁö ¸øÇß´Ù. 7 ¹æ¹ýÀÇ °³¼±
±×·¡¼ classÀÇ °¡»óÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼ °³¹ßÀÚ ÀÎÅÍÆäÀ̽º¸¦ ¸¸µé°í, ÀÌ ÀÎÅÍÆäÀ̽º¸¦ »ó¼Ó¹Þ¾Æ¼ ½ÇÁ¦ ±¸ÇöÀ» Çϵµ·Ï ÇÏ´Â ¹æ¹ýÀ» »ý°¢Çß´Ù. ¿©±â¿¡¼´Â ´ë·«ÀûÀÎ °³³ä¸¸ ¼Ò°³ÇÏ´Â Á¤µµ·Î ÇϰڴÙ.
´ÙÀ½°ú °°ÀÌ ¼ø¼ö°¡»óÇÔ¼ö¸¦ Æ÷ÇÔÇÏ´Â Interface Ŭ·¡½º¸¦ ¸¸µéµµ·Ï ÇÑ´Ù. interface.h·Î ÇϰڴÙ.
#ifndef _INTERFACE_H_
#define _INTERFACE_H_
class Log
{
private:
int data;
public:
virtual int Create()=0;
virtual int Anly()=0;
virtual int Read()=0;
virtual int Destroy()=0;
virtual ~LogAnly()
{
}
};
#endif
#include <interface.h>
#include <iostream>
class TestLogAnly : public Log
{
private:
struct _CountData
{
int count1;
int count2;
};
_CountData CData;
Config *Cfg;
public:
TestLogAnly();
int Create(char *);
int Anly();
int Read();
int Destroy();
~TestLogAnly();
};
using namespace std;
int TestLogAnly::Create()
{
cout << "Create " << endl;
return 1;
}
int TestLogAnly::Destroy()
{
cout << "Module Anly Destroy" << endl;
return 1;
}
int TestLogAnly::Anly()
{
CData.count1 = 100;
CData.count2 = 200;
cout << "Log Anly" << endl;
return 1;
}
int TestLogAnly::Read()
{
cout << "ReadData count 1 : "<< CData.count1 << endl;
cout << "ReadData count 2 : "<< CData.count2 << endl;
}
TestLogAnly::~TestLogAnly()
{
cout << "Module Destroy" << endl;
}
TestLogAnly::TestLogAnly()
{
memset((void *)&CData, 0x00, sizeof(CData));
}
// factory ÇÔ¼öÀÇ ¼±¾ð
extern "C" TestLogAnly *Obj_Create();
extern "C" void Obj_Destroy(TestLogAnly *);
TestLogAnly *Obj_Create()
{
TestLogAnly *rtv;
rtv = new TestLogAnly();
return rtv;
}
void Obj_Destroy(TestLogAnly *aLog)
{
delete aLog;
}
À̰ÍÀ¸·Î µ¿ÀûÀûÀç¿¡µµ Ŭ·¡½ºÀÇ °¡»óÈ, Ãß»óÈ, Àº´ÐÀ» Àû¿ëÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. |
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|