·¢²©ÎÄ
linux kernel ×ÔÓɲ©¿Í

http://blog.chinaunix.net/space.php?uid=10678279

   
¸öÈË×ÊÁÏ
  • ²©¿Í·ÃÎÊ£º991280
  • ²©ÎÄÊýÁ¿£º216
  • ²©¿Í»ý·Ö£º10045
  • ²©¿ÍµÈ¼¶£ºÉϽ«
  • ×¢²áʱ¼ä£º2006-08-07 12:36:48
¶©ÔÄÎҵIJ©¿Í
  • ¶©ÔÄ
  • ¶©Ôĵ½Ïʹû
  • ¶©Ôĵ½×¥Ïº
  • ¶©Ôĵ½Google
×ÖÌå´óС£º´ó ÖРС²©ÎÄ
·ÖÀࣺ ÐÂÈËÅàѵ

[תÌù] ÈçºÎÔÚ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++Í·Îļþ°É,Õâ¾ø¶ÔÊǸöºÃϰ¹ß.

²©¿ÍÍÆ¼öÎÄÕÂ
[·¢ÆÀÂÛ] ÆÀÂÛ ÖØÒªÌáʾ£º¾¯ÌèÐé¼ÙÖн±ÐÅÏ¢!
  • bob_zhang2004 2007-08-31 17:57
    ¿´ÁËÏÂÃæµÄÀý×Ó¾ÍÃ÷È·ÁË£º Æäʵһ¾ä»°£¬ ¾ÍÄÜ˵Çå³þ ¾ÙÁ½¸öÀý×Ó£¬ ÕâÁ½¸ö¿â£¬ ¸ãDevrocketµÄ¶¼ÒªÓõ½¡£ gcc -shared -Wl,-soname,libiberty.so.1 -o libiberty.so ./regex.o ./cplus-dem.o ./cp-demangle.o ./md5.o ./alloca.o ./argv.o ./choose-temp.o ./concat.o ./cp-demint.o ./dyn-string.o ./fdmatch.o ./fibheap.o ./floatformat.o ./fnmatch.o ./fopen_unlocked.o ./getopt.o ./getopt1.o ./getpwd.o ./getruntime.o ./hashtab.o ./hex.o ./lbasename.o ./lrealpath.o ./make-relative-prefix.o ./make-temp-file.o ./objalloc.o ./obstack.o ./partition.o ./pexecute.o ./physmem.o ./pex-common.o ./pex-one.o ./pex-unix.o ./safe-ctype.o ./sort.o ./spaces.o ./splay-tree.o ./strerror.o ./strsignal.o ./ternary.o ./unlink-if-ordinary.o ./xatexit.o ./xexit.o ./xmalloc.o ./xmemdup.o ./xstrdup.o ./xstrerror.o ./xstrndup.o ./mkstemps.o gcc -shared -Wl,-soname,libbfd.so.1 -o libbfd.so archive.o archures.o bfd.o bfdio.o bfdwin.o cache.o coffgen.o corefile.o format.o init.o libbfd.o opncls.o reloc.o section.o syms.o targets.o hash.o linker.o srec.o binary.o tekhex.o ihex.o stabs.o stab-syms.o merge.o dwarf2.o simple.o archive64.o elf32-i386.o elf-vxworks.o elf32.o elf.o elflink.o elf-strtab.o elf-eh-frame.o dwarf1.o i386linux.o aout32.o efi-app-ia32.o peigen.o cofflink.o elf32-gen.o cpu-i386.o trad-core.o ½âÊÍһϣº ×îÖØÒªµÄ¾ÍÊÇ gcc -shared -Wl,-soname,libiberty.so.1 -o libiberty.so ºóÃæ¶¼ÊÇ.o Îļþ ÄÇ.o ÊÇÔõôÀ´µÃ£¬ ÀàËÆÕâÑù£º g++/gcc -g -c -fPIC -o library1.o library1.c -fPIC ÊÇλÖÃÎÞ¹ØÐÔ
Ç×£¬Äú»¹Ã»ÓеǼ,Çë[µÇ¼]»ò[×¢²á]ºóÔÙ½øÐÐÆÀÂÛ