[ÅàѵÐÂÈËϵÁÐÖ®5 ] Èç¹û±àÒëÉú³É¶¯Ì¬Á´½Ó¿â
(2007-08-31 17:57)
·ÖÀࣺ ÐÂÈËÅàѵ
[תÌù] ÈçºÎÔÚlinuxÏÂÉú³É¶¯Ì¬Á´½Ó¿â£¿
ÀàËÆWindowsϵͳÖеĶ¯Ì¬Á´½Ó¿â£¬LinuxÖÐÒ²ÓÐÏàÓ¦µÄ¹²Ïí¿âÓÃÒÔÖ§³Ö´úÂëµÄ¸´Óá£WindowsÖÐΪ*.dll£¬¶øLinuxÖÐΪ*.so£¬ÎÒÀ´ÏêϸµÄ¸æËßÄãÈçºÎÔÚlinuxϱàд¶¯Ì¬¿â,ÒÔ¼°ÈçºÎʹÓÃËü.
ÔÚlinuxϱàд¶¯Ì¬Á´½Ó¿âµÄ²½Öè:
1. ±àд¿âµÄÍ·ÎļþºÍÔ´Îļþ.
2. °ÑËùÓÐÉæ¼°µ½µÄÔ´ÎļþÓÃÈçÏ·½Ê½±àÒëΪĿ±êÎļþ:
g++/gcc -g -c -fPIC -o library1.o library1.cpp
g++/gcc -g -c -fPIC -o library2.o library2.cpp
......
......
£¨×¢ÊÍ£º-fPICָͨ¹ýÕâ¸öÑ¡ÏîÀ´Éú³ÉÓëλÖÃÎ޹صĴúÂ룬¿ÉÒÔÔÚÈκεØÖ·±»Á¬½ÓºÍ×°ÔØ£¬-cÖ¸Ö»±àÒë¶ø²»Á¬½ÓÔ³ÌÐò£©
3. °ÑËùÓеÄÄ¿±êÎļþÁ´½ÓΪ¶¯Ì¬¿â:
g++/gcc -g -shared -Wl,-soname,lib***.so -o lib***.so.1.0.0 library1.o library2.o .... -lc
£¨×¢ÊÍ£º-lcÑ¡Ï±íʾʹÓÃcÓïÑԿ⣬һ°ã¶¼ÒªÓõ½£©
4. ½¨Á¢Ò»¸ö¿âÃûÁ´½Ó
ln -s lib***.so.1.0.0 lib***.so
ÏÖÔÚÄã¾Í¿ÉÒÔÒýÓÿâÁË.ÏÂÃæÎÒ·Ö±ð¸ø³ö¼òµ¥Àý×Ó¸æËßÄãÈçºÎ¶¯Ì¬ºÍ¾²Ì¬Ê¹Óö¯Ì¬¿â:
¼ÙÈçÄãµÄÓ¦ÓóÌÐòÔ´´úÂë½Ðtestlib.cpp
²ÉÓÃ\ÈçÏ·½Ê½±àÒë:
g++ -g -o testlib testlib.cpp -ldl
£¨×¢ÊÍ£º-ldlÑ¡Ï±íʾÉú³ÉµÄ¶ÔÏóÄ£¿éÐèҪʹÓù²Ïí¿â£©
////////Õâ¸öÀý×Ó¸æËßÄãÈçºÎ¶¯Ì¬µÄµ÷ÓÃ.so¿â
testlib.cpp
#include <dlfcn.h>
#include <iostream.h>
#include ...
int main()
{
void *handle=NULL;
//define a pointer which will point to the function in the lib you want to use.
YourFuntionType (*pFunc)(YourFunctionPerameterList........);
//open the lib you want to use.
handle=dlopen("/../../../yourlib.so",RTLD_LAZY);
if(handle==NULL)
{
cout<<"failed loading library!"<<endl;
return -1;
}
dlerror();
//try to load the function in lib
pFunc=(YourFuntionType(*)(YourFunctionPerameterList))dlsym(handle,"YourFuntionName");
if(dlerror()!=NULL)
{
cout<<"Loading function in lib error!"<<endl;
return -1;
}
//now you can use the funtion like this
(*pFunc)(YourFuntionPerameterList);
return 0;
}
£¨×¢ÊÍ£ºdlopen()
µÚÒ»¸ö²ÎÊý£ºÖ¸¶¨¹²Ïí¿âµÄÃû³Æ£¬½«»áÔÚÏÂÃæÎ»ÖòéÕÒÖ¸¶¨µÄ¹²Ïí¿â¡£
£»·¾³±äÁ¿LD_LIBRARY_PATHÁгöµÄÓ÷ֺżä¸ôµÄËùÓÐĿ¼¡£
£Îļþ/etc/ld.so.cacheÖÐÕÒµ½µÄ¿âµÄÁÐ±í£¬ÓÃldconfigά»¤¡£
£Ä¿Â¼usr/lib¡£
£Ä¿Â¼/lib¡£
£µ±Ç°Ä¿Â¼¡££¨ÕâÀï¾ÍÊÇÕâÖÖÇé¿ö£©
µÚ¶þ¸ö²ÎÊý£ºÖ¸¶¨ÈçºÎ´ò¿ª¹²Ïí¿â¡£
£RTLD_NOW£º½«¹²Ïí¿âÖеÄËùÓк¯Êý¼ÓÔØµ½ÄÚ´æ
£RTLD_LAZY£º »áÍÆºó¹²Ïí¿âÖеĺ¯ÊýµÄ¼ÓÔØ²Ù×÷£¬Ö±µ½µ÷ÓÃdlsym()ʱ·½¼ÓÔØÄ³º¯Êý
dlsym()
µ÷ÓÃdlsymʱ£¬ÀûÓÃdlopen()·µ»ØµÄ¹²Ïí¿âµÄphandleÒÔ¼°º¯ÊýÃû³Æ×÷Ϊ²ÎÊý£¬·µ»ØÒª¼ÓÔØº¯ÊýµÄÈë¿ÚµØÖ·¡£
dlerror()
¸Ãº¯ÊýÓÃÓÚ¼ì²éµ÷Óù²Ïí¿âµÄÏà¹Øº¯Êý³öÏֵĴíÎó¡£
£©
ÌØ±ðÐèҪעÒâµÄ¼¸µãÎÊÌâ:
1. µ±ÄãÏëÓÃc++д¶¯Ì¬¿âµÄʱºò,¼ÇסǧÍò±ðÍüÁËÔÚÍ·ÎļþÀïÃæ¼ÓÉÏÈçÏÂÄÚÈÝ,·ñÔòÉú³ÉµÄ¿âÔÚ¶¯Ì¬µ÷ÓõÄʱºò»á³öÎÊÌâ!!!!!!!
#ifdef __cplusplus
extern "C" {
#endif
....
....
#ifdef __cplusplus
}
#endif
2. µ±ÄãµÄ¿âÖаüÀ¨ÓëomniORB3Ïà¹ØµÄ¶«Î÷µÄʱºò,Ò»¶¨ÒªÔÚmakefileÖмÓÉÏ -D__x86__ -D__OSVERSION=4
/////////////Õâ¸öÀý×Ó¸æËßÄãÈçºÎ¾²Ì¬µ÷ÓÃ.so¿â
Ê×ÏÈÄãµÃÈ·±£ÄãµÄÓ¦ÓóÌÐòÄܹ»ÕÒµ½ÄãµÄ.so¿â,Õâ¿ÉÒÔÓм¸ÖÖ·½·¨À´ÊµÏÖ.
·½·¨Ò»:
1.Äã¿ÉÒÔ°ÑYourLib.so.1.0.0 ºÍYourLib.so·Åµ½/usr/libÖÐ,È»ºóÖ´ÐÐÃüÁî:ldconfig,ÕâÑùÄã¾Í¿ÉÒÔÔÚÄãµÄÓ¦ÓóÌÐòÖÐÖ±½Óµ÷ÓÃÄã¿âÖеĺ¯ÊýÁË,µ±È»Ä㠵ðѿâµÄÍ·Îļþ°üº¬µ½ÄãµÄÓ¦ÓóÌÐòÖÐ
2.±àÒëÄãµÄÓ¦ÓóÌÐò
g++/gcc -g -o yourapp yourapp.cpp ¨ClYourLib
·½·¨¶þ:
1.ÄãÒ²¿ÉÒÔ²ÉÓÃÔÚϵͳÖÐÉèÖû·¾³±äÁ¿µÄ°ì·¨À´ÊµÏÖ. ÔÚrootĿ¼ÏÂ:
vi .bash_profile
È»ºóÌí¼ÓLD_LIBRARY=/../YourDirIncludingYourLib
È»ºó×¢ÏûÒ»´Î,»·¾³±äÁ¿¾ÍÉúЧÁË,ÕâÑùÄã¾Í¿ÉÒÔÔÚÄãµÄÓ¦ÓóÌÐòÖÐÖ±½Óµ÷ÓÿâÖеĺ¯ÊýÁË,ͬÑùÄãµÃÓÐÍ·Îļþ.
2.±àÒëÄãµÄÓ¦ÓóÌÐò
g++/gcc -g -o yourapp yourapp.cpp ¨ClYourLib
·½·¨Èý:
Äã¿ÉÒÔÖ±½Ó²ÉÓÃÔÚ±àÒëÁ´½ÓµÄʱºò¸æËßϵͳÄãµÄ¿âÔÚʲôµØ·½
g++/gcc -g -o yourapp yourapp.cpp -L/YourDirIncludingYourLib ¨ClYourLib
/////////////////////////////////
¼ÙÈçÄãµÄ¿âÖÐÓиöº¯Êý:int eat(.....)
ÄÇô²ÉÓÃÈçÏ·½Ê½µ÷ÓÃËü
yourapp.cpp
#include "YourLib.h"
int main()
{
eat();
return 0;
}
ÊDz»ÊǺÜeasy?¶ÔÁËÔÚ¾²Ì¬µ÷ÓõÄʱºòºÃÏñ²»´æÔÚÉÏÃæµÄ"×¢Òâ1"µÄÎÊÌâ,²»¹ý¼øÓÚ±£ÏÕÆð¼û,×îºÃ»¹Êǰ´ÕÕ±ê×¼µÄ·½Ê½Ð´c++Í·Îļþ°É,Õâ¾ø¶ÔÊǸöºÃϰ¹ß.
ÔÚlinuxϱàд¶¯Ì¬Á´½Ó¿âµÄ²½Öè:
1. ±àд¿âµÄÍ·ÎļþºÍÔ´Îļþ.
2. °ÑËùÓÐÉæ¼°µ½µÄÔ´ÎļþÓÃÈçÏ·½Ê½±àÒëΪĿ±êÎļþ:
g++/gcc -g -c -fPIC -o library1.o library1.cpp
g++/gcc -g -c -fPIC -o library2.o library2.cpp
......
......
£¨×¢ÊÍ£º-fPICָͨ¹ýÕâ¸öÑ¡ÏîÀ´Éú³ÉÓëλÖÃÎ޹صĴúÂ룬¿ÉÒÔÔÚÈκεØÖ·±»Á¬½ÓºÍ×°ÔØ£¬-cÖ¸Ö»±àÒë¶ø²»Á¬½ÓÔ³ÌÐò£©
3. °ÑËùÓеÄÄ¿±êÎļþÁ´½ÓΪ¶¯Ì¬¿â:
g++/gcc -g -shared -Wl,-soname,lib***.so -o lib***.so.1.0.0 library1.o library2.o .... -lc
£¨×¢ÊÍ£º-lcÑ¡Ï±íʾʹÓÃcÓïÑԿ⣬һ°ã¶¼ÒªÓõ½£©
4. ½¨Á¢Ò»¸ö¿âÃûÁ´½Ó
ln -s lib***.so.1.0.0 lib***.so
ÏÖÔÚÄã¾Í¿ÉÒÔÒýÓÿâÁË.ÏÂÃæÎÒ·Ö±ð¸ø³ö¼òµ¥Àý×Ó¸æËßÄãÈçºÎ¶¯Ì¬ºÍ¾²Ì¬Ê¹Óö¯Ì¬¿â:
¼ÙÈçÄãµÄÓ¦ÓóÌÐòÔ´´úÂë½Ðtestlib.cpp
²ÉÓÃ\ÈçÏ·½Ê½±àÒë:
g++ -g -o testlib testlib.cpp -ldl
£¨×¢ÊÍ£º-ldlÑ¡Ï±íʾÉú³ÉµÄ¶ÔÏóÄ£¿éÐèҪʹÓù²Ïí¿â£©
////////Õâ¸öÀý×Ó¸æËßÄãÈçºÎ¶¯Ì¬µÄµ÷ÓÃ.so¿â
testlib.cpp
#include <dlfcn.h>
#include <iostream.h>
#include ...
int main()
{
void *handle=NULL;
//define a pointer which will point to the function in the lib you want to use.
YourFuntionType (*pFunc)(YourFunctionPerameterList........);
//open the lib you want to use.
handle=dlopen("/../../../yourlib.so",RTLD_LAZY);
if(handle==NULL)
{
cout<<"failed loading library!"<<endl;
return -1;
}
dlerror();
//try to load the function in lib
pFunc=(YourFuntionType(*)(YourFunctionPerameterList))dlsym(handle,"YourFuntionName");
if(dlerror()!=NULL)
{
cout<<"Loading function in lib error!"<<endl;
return -1;
}
//now you can use the funtion like this
(*pFunc)(YourFuntionPerameterList);
return 0;
}
£¨×¢ÊÍ£ºdlopen()
µÚÒ»¸ö²ÎÊý£ºÖ¸¶¨¹²Ïí¿âµÄÃû³Æ£¬½«»áÔÚÏÂÃæÎ»ÖòéÕÒÖ¸¶¨µÄ¹²Ïí¿â¡£
£»·¾³±äÁ¿LD_LIBRARY_PATHÁгöµÄÓ÷ֺżä¸ôµÄËùÓÐĿ¼¡£
£Îļþ/etc/ld.so.cacheÖÐÕÒµ½µÄ¿âµÄÁÐ±í£¬ÓÃldconfigά»¤¡£
£Ä¿Â¼usr/lib¡£
£Ä¿Â¼/lib¡£
£µ±Ç°Ä¿Â¼¡££¨ÕâÀï¾ÍÊÇÕâÖÖÇé¿ö£©
µÚ¶þ¸ö²ÎÊý£ºÖ¸¶¨ÈçºÎ´ò¿ª¹²Ïí¿â¡£
£RTLD_NOW£º½«¹²Ïí¿âÖеÄËùÓк¯Êý¼ÓÔØµ½ÄÚ´æ
£RTLD_LAZY£º »áÍÆºó¹²Ïí¿âÖеĺ¯ÊýµÄ¼ÓÔØ²Ù×÷£¬Ö±µ½µ÷ÓÃdlsym()ʱ·½¼ÓÔØÄ³º¯Êý
dlsym()
µ÷ÓÃdlsymʱ£¬ÀûÓÃdlopen()·µ»ØµÄ¹²Ïí¿âµÄphandleÒÔ¼°º¯ÊýÃû³Æ×÷Ϊ²ÎÊý£¬·µ»ØÒª¼ÓÔØº¯ÊýµÄÈë¿ÚµØÖ·¡£
dlerror()
¸Ãº¯ÊýÓÃÓÚ¼ì²éµ÷Óù²Ïí¿âµÄÏà¹Øº¯Êý³öÏֵĴíÎó¡£
£©
ÌØ±ðÐèҪעÒâµÄ¼¸µãÎÊÌâ:
1. µ±ÄãÏëÓÃc++д¶¯Ì¬¿âµÄʱºò,¼ÇסǧÍò±ðÍüÁËÔÚÍ·ÎļþÀïÃæ¼ÓÉÏÈçÏÂÄÚÈÝ,·ñÔòÉú³ÉµÄ¿âÔÚ¶¯Ì¬µ÷ÓõÄʱºò»á³öÎÊÌâ!!!!!!!
#ifdef __cplusplus
extern "C" {
#endif
....
....
#ifdef __cplusplus
}
#endif
2. µ±ÄãµÄ¿âÖаüÀ¨ÓëomniORB3Ïà¹ØµÄ¶«Î÷µÄʱºò,Ò»¶¨ÒªÔÚmakefileÖмÓÉÏ -D__x86__ -D__OSVERSION=4
/////////////Õâ¸öÀý×Ó¸æËßÄãÈçºÎ¾²Ì¬µ÷ÓÃ.so¿â
Ê×ÏÈÄãµÃÈ·±£ÄãµÄÓ¦ÓóÌÐòÄܹ»ÕÒµ½ÄãµÄ.so¿â,Õâ¿ÉÒÔÓм¸ÖÖ·½·¨À´ÊµÏÖ.
·½·¨Ò»:
1.Äã¿ÉÒÔ°ÑYourLib.so.1.0.0 ºÍYourLib.so·Åµ½/usr/libÖÐ,È»ºóÖ´ÐÐÃüÁî:ldconfig,ÕâÑùÄã¾Í¿ÉÒÔÔÚÄãµÄÓ¦ÓóÌÐòÖÐÖ±½Óµ÷ÓÃÄã¿âÖеĺ¯ÊýÁË,µ±È»Ä㠵ðѿâµÄÍ·Îļþ°üº¬µ½ÄãµÄÓ¦ÓóÌÐòÖÐ
2.±àÒëÄãµÄÓ¦ÓóÌÐò
g++/gcc -g -o yourapp yourapp.cpp ¨ClYourLib
·½·¨¶þ:
1.ÄãÒ²¿ÉÒÔ²ÉÓÃÔÚϵͳÖÐÉèÖû·¾³±äÁ¿µÄ°ì·¨À´ÊµÏÖ. ÔÚrootĿ¼ÏÂ:
vi .bash_profile
È»ºóÌí¼ÓLD_LIBRARY=/../YourDirIncludingYourLib
È»ºó×¢ÏûÒ»´Î,»·¾³±äÁ¿¾ÍÉúЧÁË,ÕâÑùÄã¾Í¿ÉÒÔÔÚÄãµÄÓ¦ÓóÌÐòÖÐÖ±½Óµ÷ÓÿâÖеĺ¯ÊýÁË,ͬÑùÄãµÃÓÐÍ·Îļþ.
2.±àÒëÄãµÄÓ¦ÓóÌÐò
g++/gcc -g -o yourapp yourapp.cpp ¨ClYourLib
·½·¨Èý:
Äã¿ÉÒÔÖ±½Ó²ÉÓÃÔÚ±àÒëÁ´½ÓµÄʱºò¸æËßϵͳÄãµÄ¿âÔÚʲôµØ·½
g++/gcc -g -o yourapp yourapp.cpp -L/YourDirIncludingYourLib ¨ClYourLib
/////////////////////////////////
¼ÙÈçÄãµÄ¿âÖÐÓиöº¯Êý:int eat(.....)
ÄÇô²ÉÓÃÈçÏ·½Ê½µ÷ÓÃËü
yourapp.cpp
#include "YourLib.h"
int main()
{
eat();
return 0;
}
ÊDz»ÊǺÜeasy?¶ÔÁËÔÚ¾²Ì¬µ÷ÓõÄʱºòºÃÏñ²»´æÔÚÉÏÃæµÄ"×¢Òâ1"µÄÎÊÌâ,²»¹ý¼øÓÚ±£ÏÕÆð¼û,×îºÃ»¹Êǰ´ÕÕ±ê×¼µÄ·½Ê½Ð´c++Í·Îļþ°É,Õâ¾ø¶ÔÊǸöºÃϰ¹ß.


