Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
C++¾²Ì¬¿âÓ붯̬¿â
 
×÷ÕߣºÎâÇØ À´Ô´£º²©¿ÍÔ° ·¢²¼ÓÚ£º2015-9-10
  3479  次浏览      28
 

Õâ´Î·ÖÏíµÄ×ÚÖ¼ÊÇ¡ª¡ªÈôó¼Òѧ»á´´½¨ÓëʹÓþ²Ì¬¿â¡¢¶¯Ì¬¿â£¬ÖªµÀ¾²Ì¬¿âÓ붯̬¿âµÄÇø±ð£¬ÖªµÀʹÓõÄʱºòÈçºÎÑ¡Ôñ¡£ÕâÀï²»ÉîÈë½éÉܾ²Ì¬¿â¡¢¶¯Ì¬¿âµÄµ×²ã¸ñʽ£¬ÄÚ´æ²¼¾ÖµÈ£¬ÓÐÐËȤµÄͬѧ£¬ÍƼöÒ»±¾Êé¡¶³ÌÐòÔ±µÄ×ÔÎÒÐÞÑø¡ª¡ªÁ´½Ó¡¢×°ÔØÓë¿â¡·¡£

ʲôÊÇ¿â

¿âÊÇдºÃµÄÏÖÓе쬳ÉÊìµÄ£¬¿ÉÒÔ¸´ÓõĴúÂë¡£ÏÖʵÖÐÿ¸ö³ÌÐò¶¼ÒªÒÀÀµºÜ¶à»ù´¡µÄµ×²ã¿â£¬²»¿ÉÄÜÿ¸öÈ˵ĴúÂë¶¼´ÓÁ㿪ʼ£¬Òò´Ë¿âµÄ´æÔÚÒâÒå·ÇͬѰ³£¡£

±¾ÖÊÉÏÀ´Ëµ¿âÊÇÒ»ÖÖ¿ÉÖ´ÐдúÂëµÄ¶þ½øÖÆÐÎʽ£¬¿ÉÒÔ±»²Ù×÷ÏµÍ³ÔØÈëÄÚ´æÖ´ÐС£¿âÓÐÁ½ÖÖ£º¾²Ì¬¿â£¨.a¡¢.lib£©ºÍ¶¯Ì¬¿â£¨.so¡¢.dll£©¡£

Ëùν¾²Ì¬¡¢¶¯Ì¬ÊÇÖ¸Á´½Ó¡£»Ø¹Ëһϣ¬½«Ò»¸ö³ÌÐò±àÒë³É¿ÉÖ´ÐгÌÐòµÄ²½Ö裺

ͼ£º±àÒë¹ý³Ì

¾²Ì¬¿â

Ö®ËùÒÔ³ÉΪ¡¾¾²Ì¬¿â¡¿£¬ÊÇÒòΪÔÚÁ´½Ó½×¶Î£¬»á½«»ã±àÉú³ÉµÄÄ¿±êÎļþ.oÓëÒýÓõ½µÄ¿âÒ»ÆðÁ´½Ó´ò°üµ½¿ÉÖ´ÐÐÎļþÖС£Òò´Ë¶ÔÓ¦µÄÁ´½Ó·½Ê½³ÆÎª¾²Ì¬Á´½Ó¡£

ÊÔÏëһϣ¬¾²Ì¬¿âÓë»ã±àÉú³ÉµÄÄ¿±êÎļþÒ»ÆðÁ´½ÓΪ¿ÉÖ´ÐÐÎļþ£¬ÄÇô¾²Ì¬¿â±Ø¶¨¸ú.oÎļþ¸ñʽÏàËÆ¡£Æäʵһ¸ö¾²Ì¬¿â¿ÉÒÔ¼òµ¥¿´³ÉÊÇÒ»×éÄ¿±êÎļþ£¨.o/.objÎļþ£©µÄ¼¯ºÏ£¬¼´ºÜ¶àÄ¿±êÎļþ¾­¹ýѹËõ´ò°üºóÐγɵÄÒ»¸öÎļþ¡£

¾²Ì¬¿âÌØµã×ܽ᣺

¾²Ì¬¿â¶Ôº¯Êý¿âµÄÁ´½ÓÊÇ·ÅÔÚ±àÒëʱÆÚÍê³ÉµÄ¡£

³ÌÐòÔÚÔËÐÐʱÓ뺯Êý¿âÔÙÎ޹ϸð£¬ÒÆÖ²·½±ã¡£

À˷ѿռäºÍ×ÊÔ´£¬ÒòΪËùÓÐÏà¹ØµÄÄ¿±êÎļþÓëÇ£Éæµ½µÄº¯Êý¿â±»Á´½ÓºÏ³ÉÒ»¸ö¿ÉÖ´ÐÐÎļþ¡£

ÏÂÃæ±àдһЩ¼òµ¥µÄËÄÔòÔËËãC++À࣬½«Æä±àÒë³É¾²Ì¬¿â¸øËûÈËÓã¬Í·ÎļþÈçÏÂËùʾ£º

StaticMath.hÍ·Îļþ

#pragma once

class StaticMath

{

public:

StaticMath(void);

~StaticMath(void);

static double add(double a, double b);//¼Ó·¨

static double sub(double a, double b);//¼õ·¨

static double mul(double a, double b);//³Ë·¨

static double div(double a, double b);//³ý·¨

void print();

};

LinuxÏÂʹÓÃar¹¤¾ß¡¢WindowsÏÂvsʹÓÃlib.exe£¬½«Ä¿±êÎļþѹËõµ½Ò»Æð£¬²¢ÇÒ¶ÔÆä½øÐбàºÅºÍË÷Òý£¬ÒÔ±ãÓÚ²éÕҺͼìË÷¡£Ò»°ã´´½¨¾²Ì¬¿âµÄ²½ÖèÈçͼËùʾ£º

ͼ£º´´½¨¾²Ì¬¿â¹ý³Ì

LinuxÏ´´½¨ÓëʹÓþ²Ì¬¿â

Linux¾²Ì¬¿âÃüÃû¹æÔò

Linux¾²Ì¬¿âÃüÃû¹æ·¶£¬±ØÐëÊÇ"lib[your_library_name].a"£ºlibΪǰ׺£¬ÖмäÊǾ²Ì¬¿âÃû£¬À©Õ¹ÃûΪ.a¡£

´´½¨¾²Ì¬¿â£¨.a£©

ͨ¹ýÉÏÃæµÄÁ÷³Ì¿ÉÒÔÖªµÀ£¬Linux´´½¨¾²Ì¬¿â¹ý³ÌÈçÏ£º

Ê×ÏÈ£¬½«´úÂëÎļþ±àÒë³ÉÄ¿±êÎļþ.o£¨StaticMath.o£©

g++ -c StaticMath.cpp

×¢Òâ´ø²ÎÊý-c£¬·ñÔòÖ±½Ó±àÒëΪ¿ÉÖ´ÐÐÎļþ

È»ºó£¬Í¨¹ýar¹¤¾ß½«Ä¿±êÎļþ´ò°ü³É.a¾²Ì¬¿âÎļþ

ar -crv libstaticmath.a StaticMath.o

Éú³É¾²Ì¬¿âlibstaticmath.a¡£

´óÒ»µãµÄÏîÄ¿»á±àдmakefileÎļþ£¨CMakeµÈµÈ¹¤³Ì¹ÜÀí¹¤¾ß£©À´Éú³É¾²Ì¬¿â£¬ÊäÈë¶à¸öÃüÁîÌ«Âé·³ÁË¡£

ʹÓþ²Ì¬¿â

±àдʹÓÃÉÏÃæ´´½¨µÄ¾²Ì¬¿âµÄ²âÊÔ´úÂ룺

²âÊÔ´úÂ룺

#include "StaticMath.h"

#include <iostream>

using namespace std;

int main(int argc, char* argv[])

{

double a = 10;

double b = 2;

cout << "a + b = " << StaticMath::add(a, b) << endl;

cout << "a - b = " << StaticMath::sub(a, b) << endl;

cout << "a * b = " << StaticMath::mul(a, b) << endl;

cout << "a / b = " << StaticMath::div(a, b) << endl;

StaticMath sm;

sm.print();

system("pause");

return 0;

}

LinuxÏÂʹÓþ²Ì¬¿â£¬Ö»ÐèÒªÔÚ±àÒëµÄʱºò£¬Ö¸¶¨¾²Ì¬¿âµÄËÑË÷·¾¶£¨-LÑ¡Ï¡¢Ö¸¶¨¾²Ì¬¿âÃû£¨²»ÐèÒªlibǰ׺ºÍ.aºó׺£¬-lÑ¡Ï¡£

# g++ TestStaticLibrary.cpp -L../StaticLibrary -lstaticmath

-L£º±íʾҪÁ¬½ÓµÄ¿âËùÔÚĿ¼

-l£ºÖ¸¶¨Á´½ÓʱÐèÒªµÄ¶¯Ì¬¿â£¬±àÒëÆ÷²éÕÒ¶¯Ì¬Á¬½Ó¿âʱÓÐÒþº¬µÄÃüÃû¹æÔò£¬¼´ÔÚ¸ø³öµÄÃû×ÖÇ°Ãæ¼ÓÉÏlib£¬ºóÃæ¼ÓÉÏ.a»ò.soÀ´È·¶¨¿âµÄÃû³Æ¡£

WindowsÏ´´½¨ÓëʹÓþ²Ì¬¿â

´´½¨¾²Ì¬¿â£¨.lib£©

Èç¹ûÊÇʹÓÃVSÃüÁîÐÐÉú³É¾²Ì¬¿â£¬Ò²ÊÇ·ÖÁ½¸ö²½ÖèÀ´Éú³É³ÌÐò£º

Ê×ÏÈ£¬Í¨¹ýʹÓôø±àÒëÆ÷Ñ¡Ïî /c µÄ Cl.exe ±àÒë´úÂë (cl /c StaticMath.cpp)£¬´´½¨ÃûΪ¡°StaticMath.obj¡±µÄÄ¿±êÎļþ¡£

È»ºó£¬Ê¹Óÿâ¹ÜÀíÆ÷ Lib.exe Á´½Ó´úÂë (lib StaticMath.obj)£¬´´½¨¾²Ì¬¿âStaticMath.lib¡£

µ±È»£¬ÎÒÃÇÒ»°ã²»ÕâôÓã¬Ê¹ÓÃVS¹¤³ÌÉèÖøü·½±ã¡£´´½¨win32¿ØÖÆÌ¨³ÌÐòʱ£¬¹´Ñ¡¾²Ì¬¿âÀàÐÍ£»´ò¿ª¹¤³Ì¡°ÊôÐÔÃæ°å¡±¨¨¡±ÅäÖÃÊôÐÔ¡±¨¨¡±³£¹æ¡±£¬ÅäÖÃÀàÐÍÑ¡Ôñ¾²Ì¬¿â¡£

ͼ£ºvs¾²Ì¬¿âÏîÄ¿ÊôÐÔÉèÖÃ

BuildÏîÄ¿¼´¿ÉÉú³É¾²Ì¬¿â¡£

ʹÓþ²Ì¬¿â

²âÊÔ´úÂëLinuxÏÂÃæµÄÒ»Ñù¡£ÓÐ3ÖÖʹÓ÷½·¨£º

·½·¨Ò»£º

ÔÚVSÖÐʹÓþ²Ì¬¿â·½·¨£º

¹¤³Ì¡°ÊôÐÔÃæ°å¡±¨¨¡°Í¨ÓÃÊôÐÔ¡±¨¨ ¡°¿ò¼ÜºÍÒýÓᱨ¨¡±Ìí¼ÓÒýÓá±£¬½«ÏÔʾ¡°Ìí¼ÓÒýÓá±¶Ô»°¿ò¡£ ¡°ÏîÄ¿¡±Ñ¡ÏÁгöÁ˵±Ç°½â¾ö·½°¸Öеĸ÷¸öÏîÄ¿ÒÔ¼°¿ÉÒÔÒýÓõÄËùÓп⡣ ÔÚ¡°ÏîÄ¿¡±Ñ¡ÏÖУ¬Ñ¡Ôñ StaticLibrary¡£ µ¥»÷¡°È·¶¨¡±¡£

Ìí¼ÓStaticMath.h Í·ÎļþĿ¼£¬±ØÐëÐ޸İüº¬Ä¿Â¼Â·¾¶¡£´ò¿ª¹¤³Ì¡°ÊôÐÔÃæ°å¡±¨¨¡±ÅäÖÃÊôÐÔ¡±¨¨ ¡°C/C++¡±¨¨¡± ³£¹æ¡±£¬ÔÚ¡°¸½¼Ó°üº¬Ä¿Â¼¡±ÊôÐÔÖµÖУ¬¼üÈëStaticMath.h Í·ÎļþËùÔÚĿ¼µÄ·¾¶»òä¯ÀÀÖÁ¸ÃĿ¼¡£

±àÒëÔËÐÐOK¡£

ͼ£º¾²Ì¬¿â²âÊÔ½á¹û£¨vs£©

Èç¹ûÒýÓõľ²Ì¬¿â²»ÊÇÔÚͬһ½â¾ö·½°¸ÏµÄ×Ó¹¤³Ì£¬¶øÊÇʹÓõÚÈý·½ÌṩµÄ¾²Ì¬¿âlibºÍÍ·Îļþ£¬ÉÏÃæµÄ·½·¨ÉèÖò»ÁË¡£»¹ÓÐ2Öз½·¨ÉèÖö¼¿ÉÐС£

·½·¨¶þ£º

´ò¿ª¹¤³Ì¡°ÊôÐÔÃæ°å¡±¨¨¡±ÅäÖÃÊôÐÔ¡±¨¨ ¡°Á´½ÓÆ÷¡±¨¨¡±ÃüÁîÐС±£¬ÊäÈ뾲̬¿âµÄÍêÕû·¾¶¼´¿É¡£

·½·¨Èý£º

¡°ÊôÐÔÃæ°å¡±¨¨¡±ÅäÖÃÊôÐÔ¡±¨¨ ¡°Á´½ÓÆ÷¡±¨¨¡±³£¹æ¡±£¬¸½¼ÓÒÀÀµ¿âĿ¼ÖÐÊäÈ룬¾²Ì¬¿âËùÔÚĿ¼£»

¡°ÊôÐÔÃæ°å¡±¨¨¡±ÅäÖÃÊôÐÔ¡±¨¨ ¡°Á´½ÓÆ÷¡±¨¨¡±ÊäÈ롱£¬¸½¼ÓÒÀÀµ¿âÖÐÊäÈ뾲̬¿âÃûStaticLibrary.lib¡£

¶¯Ì¬¿â

ͨ¹ýÉÏÃæµÄ½éÉÜ·¢ÏÖ¾²Ì¬¿â£¬ÈÝÒ×ʹÓúÍÀí½â£¬Ò²´ïµ½ÁË´úÂ븴ÓõÄÄ¿µÄ£¬ÄÇΪʲô»¹ÐèÒª¶¯Ì¬¿âÄØ£¿

Ϊʲô»¹ÐèÒª¶¯Ì¬¿â£¿

ΪʲôÐèÒª¶¯Ì¬¿â£¬ÆäʵҲÊǾ²Ì¬¿âµÄÌØµãµ¼Ö¡£

¿Õ¼äÀË·ÑÊǾ²Ì¬¿âµÄÒ»¸öÎÊÌâ¡£

ÁíÒ»¸öÎÊÌâÊǾ²Ì¬¿â¶Ô³ÌÐòµÄ¸üС¢²¿ÊðºÍ·¢²¼Ò³»á´øÀ´Âé·³¡£Èç¹û¾²Ì¬¿âliba.lib¸üÐÂÁË£¬ËùÒÔʹÓÃËüµÄÓ¦ÓóÌÐò¶¼ÐèÒªÖØÐ±àÒë¡¢·¢²¼¸øÓû§£¨¶ÔÓÚÍæ¼ÒÀ´Ëµ£¬¿ÉÄÜÊÇÒ»¸öºÜСµÄ¸Ä¶¯£¬È´µ¼ÖÂÕû¸ö³ÌÐòÖØÐÂÏÂÔØ£¬È«Á¿¸üУ©¡£

¶¯Ì¬¿âÔÚ³ÌÐò±àÒëʱ²¢²»»á±»Á¬½Óµ½Ä¿±ê´úÂëÖУ¬¶øÊÇÔÚ³ÌÐòÔËÐÐÊDzű»ÔØÈë¡£²»Í¬µÄÓ¦ÓóÌÐòÈç¹ûµ÷ÓÃÏàͬµÄ¿â£¬ÄÇôÔÚÄÚ´æÀïÖ»ÐèÒªÓÐÒ»·Ý¸Ã¹²Ïí¿âµÄʵÀý£¬¹æ±ÜÁ˿ռäÀË·ÑÎÊÌâ¡£¶¯Ì¬¿âÔÚ³ÌÐòÔËÐÐÊDzű»ÔØÈ룬Ҳ½â¾öÁ˾²Ì¬¿â¶Ô³ÌÐòµÄ¸üС¢²¿ÊðºÍ·¢²¼Ò³»á´øÀ´Âé·³¡£Óû§Ö»ÐèÒª¸üж¯Ì¬¿â¼´¿É£¬ÔöÁ¿¸üС£

¶¯Ì¬¿âÌØµã×ܽ᣺

¶¯Ì¬¿â°Ñ¶ÔһЩ¿âº¯ÊýµÄÁ´½ÓÔØÈëÍÆ³Ùµ½³ÌÐòÔËÐеÄʱÆÚ¡£

¿ÉÒÔʵÏÖ½ø³ÌÖ®¼äµÄ×ÊÔ´¹²Ïí¡££¨Òò´Ë¶¯Ì¬¿âÒ²³ÆÎª¹²Ïí¿â£©

½«Ò»Ð©³ÌÐòÉý¼¶±äµÃ¼òµ¥¡£

ÉõÖÁ¿ÉÒÔÕæÕý×öµ½Á´½ÓÔØÈëÍêÈ«ÓɳÌÐòÔ±ÔÚ³ÌÐò´úÂëÖпØÖÆ£¨ÏÔʾµ÷Óã©¡£

WindowÓëLinuxÖ´ÐÐÎļþ¸ñʽ²»Í¬£¬ÔÚ´´½¨¶¯Ì¬¿âµÄʱºòÓÐһЩ²îÒì¡£

ÔÚWindowsϵͳϵÄÖ´ÐÐÎļþ¸ñʽÊÇPE¸ñʽ£¬¶¯Ì¬¿âÐèÒªÒ»¸öDllMainº¯Êý×ö³ö³õʼ»¯µÄÈë¿Ú£¬Í¨³£ÔÚµ¼³öº¯ÊýµÄÉùÃ÷ʱÐèÒªÓÐ_declspec(dllexport)¹Ø¼ü×Ö¡£

LinuxÏÂgcc±àÒëµÄÖ´ÐÐÎļþĬÈÏÊÇELF¸ñʽ£¬²»ÐèÒª³õʼ»¯Èë¿Ú£¬Ò಻ÐèÒªº¯Êý×öÌØ±ðµÄÉùÃ÷£¬±àд±È½Ï·½±ã¡£

Óë´´½¨¾²Ì¬¿â²»Í¬µÄÊÇ£¬²»ÐèÒª´ò°ü¹¤¾ß£¨ar¡¢lib.exe£©£¬Ö±½ÓʹÓñàÒëÆ÷¼´¿É´´½¨¶¯Ì¬¿â¡£

LinuxÏ´´½¨ÓëʹÓö¯Ì¬¿â

linux¶¯Ì¬¿âµÄÃüÃû¹æÔò

¶¯Ì¬Á´½Ó¿âµÄÃû×ÖÐÎʽΪ libxxx.so£¬Ç°×ºÊÇlib£¬ºó׺ÃûΪ¡°.so¡±¡£

Õë¶ÔÓÚʵ¼Ê¿âÎļþ£¬Ã¿¸ö¹²Ïí¿â¶¼ÓиöÌØÊâµÄÃû×Ö¡°soname¡±¡£ÔÚ³ÌÐòÆô¶¯ºó£¬³ÌÐòͨ¹ýÕâ¸öÃû×ÖÀ´¸æËß¶¯Ì¬¼ÓÔØÆ÷¸ÃÔØÈëÄĸö¹²Ïí¿â¡£

ÔÚÎļþϵͳÖУ¬soname½öÊÇÒ»¸öÁ´½Óµ½Êµ¼Ê¶¯Ì¬¿âµÄÁ´½Ó¡£¶ÔÓÚ¶¯Ì¬¿â¶øÑÔ£¬Ã¿¸ö¿âʵ¼ÊÉ϶¼ÓÐÁíÒ»¸öÃû×Ö¸ø±àÒëÆ÷À´Óá£ËüÊÇÒ»¸öÖ¸Ïòʵ¼Ê¿â¾µÏñÎļþµÄÁ´½ÓÎļþ£¨lib+soname+.so£©¡£

´´½¨¶¯Ì¬¿â£¨.so£©

±àдËÄÔòÔËË㶯̬¿â´úÂ룺

DynamicMath.hÍ·Îļþ

#pragma once

class DynamicMath

{

public:

DynamicMath(void);

~DynamicMath(void);

static double add(double a, double b);//?¨®¡¤¡§

static double sub(double a, double b);//??¡¤¡§

static double mul(double a, double b);//3?¡¤¡§

static double div(double a, double b);//3y¡¤¡§

void print();

};

Ê×ÏÈ£¬Éú³ÉÄ¿±êÎļþ£¬´ËʱҪ¼Ó±àÒëÆ÷Ñ¡Ïî-fpic

g++ -fPIC -c DynamicMath.cpp

-fPIC ´´½¨ÓëµØÖ·Î޹صıàÒë³ÌÐò£¨pic£¬position independent code£©£¬ÊÇΪÁËÄܹ»ÔÚ¶à¸öÓ¦ÓóÌÐò¼ä¹²Ïí¡£

È»ºó£¬Éú³É¶¯Ì¬¿â£¬´ËʱҪ¼ÓÁ´½ÓÆ÷Ñ¡Ïî-shared

g++ -shared -o libdynmath.so DynamicMath.o

-sharedÖ¸¶¨Éú³É¶¯Ì¬Á´½Ó¿â¡£

ÆäʵÉÏÃæÁ½¸ö²½Öè¿ÉÒԺϲ¢ÎªÒ»¸öÃüÁ

g++ -fPIC -shared -o libdynmath.so DynamicMath.cpp

ʹÓö¯Ì¬¿â

±àдʹÓö¯Ì¬¿âµÄ²âÊÔ´úÂ룺

²âÊÔ´úÂ룺

#include "../DynamicLibrary/DynamicMath.h"

#include <iostream>

using namespace std;

int main(int argc, char* argv[])

{

double a = 10;

double b = 2;

cout << "a + b = " << DynamicMath::add(a, b) << endl;

cout << "a - b = " << DynamicMath::sub(a, b) << endl;

cout << "a * b = " << DynamicMath::mul(a, b) << endl;

cout << "a / b = " << DynamicMath::div(a, b) << endl;

DynamicMath dyn;

dyn.print();

return 0;

}

ÒýÓö¯Ì¬¿â±àÒë³É¿ÉÖ´ÐÐÎļþ£¨¸ú¾²Ì¬¿â·½Ê½Ò»Ñù£©£º

g++ TestDynamicLibrary.cpp -L../DynamicLibrary -ldynmath

È»ºóÔËÐУº./a.out£¬·¢ÏÖ¾¹È»±¨´íÁË£¡£¡£¡

¿ÉÄÜ´ó¼Ò»á²Â²â£¬ÊÇÒòΪ¶¯Ì¬¿â¸ú²âÊÔ³ÌÐò²»ÊÇÒ»¸öĿ¼£¬ÄÇÎÒÃÇÑéÖ¤ÏÂÊÇ·ñÈç´Ë£º

·¢ÏÖ»¹ÊDZ¨´í£¡£¡£¡ÄÇô£¬ÔÚÖ´ÐеÄʱºòÊÇÈçºÎ¶¨Î»¹²Ïí¿âÎļþµÄÄØ£¿

1) µ±ÏµÍ³¼ÓÔØ¿ÉÖ´ÐдúÂëʱºò£¬Äܹ»ÖªµÀÆäËùÒÀÀµµÄ¿âµÄÃû×Ö£¬µ«ÊÇ»¹ÐèÒªÖªµÀ¾ø¶Ô·¾¶¡£´Ëʱ¾ÍÐèҪϵͳ¶¯Ì¬ÔØÈëÆ÷(dynamic linker/loader)¡£

2) ¶ÔÓÚelf¸ñʽµÄ¿ÉÖ´ÐгÌÐò£¬ÊÇÓÉld-linux.so*À´Íê³ÉµÄ£¬ËüÏȺóËÑË÷elfÎļþµÄ DT_RPATH¶Î¡ª»·¾³±äÁ¿LD_LIBRARY_PATH¡ª/etc/ld.so.cacheÎļþÁÐ±í¡ª/lib/,/usr/lib Ŀ¼ÕÒµ½¿âÎļþºó½«ÆäÔØÈëÄÚ´æ¡£

ÈçºÎÈÃϵͳÄܹ»ÕÒµ½Ëü£º

Èç¹û°²×°ÔÚ/lib»òÕß/usr/libÏ£¬ÄÇôldĬÈÏÄܹ»ÕÒµ½£¬ÎÞÐèÆäËû²Ù×÷¡£

Èç¹û°²×°ÔÚÆäËûĿ¼£¬ÐèÒª½«ÆäÌí¼Óµ½/etc/ld.so.cacheÎļþÖУ¬²½ÖèÈçÏ£º

±à¼­/etc/ld.so.confÎļþ£¬¼ÓÈë¿âÎļþËùÔÚĿ¼µÄ·¾¶

ÔËÐÐldconfig £¬¸ÃÃüÁî»áÖØ½¨/etc/ld.so.cacheÎļþ

ÎÒÃǽ«´´½¨µÄ¶¯Ì¬¿â¸´ÖƵ½/usr/libÏÂÃæ£¬È»ºóÔËÐвâÊÔ³ÌÐò¡£

WindowsÏ´´½¨ÓëʹÓö¯Ì¬¿â

´´½¨¶¯Ì¬¿â£¨.dll£©

ÓëLinuxÏà±È£¬ÔÚWindowsϵͳÏ´´½¨¶¯Ì¬¿âÒªÉÔ΢Â鷳һЩ¡£Ê×ÏÈ£¬ÐèÒªÒ»¸öDllMainº¯Êý×ö³ö³õʼ»¯µÄÈë¿Ú£¨´´½¨win32¿ØÖÆÌ¨³ÌÐòʱ£¬¹´Ñ¡DLLÀàÐÍ»á×Ô¶¯Éú³ÉÕâ¸öÎļþ£©£º

dllmain.cppÈë¿ÚÎļþ

// dllmain.cpp : Defines the entry point for the DLL application.

#include "stdafx.h"

BOOL APIENTRY DllMain( HMODULE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}

return TRUE;

}

ͨ³£ÔÚµ¼³öº¯ÊýµÄÉùÃ÷ʱÐèÒªÓÐ_declspec(dllexport)¹Ø¼ü×Ö£º

DynamicMath.hÍ·Îļþ

#pragma once

class DynamicMath

{

public:

__declspec(dllexport) DynamicMath(void);

__declspec(dllexport) ~DynamicMath(void);

static __declspec(dllexport) double add(double a, double b);//¼Ó·¨

static __declspec(dllexport) double sub(double a, double b);//¼õ·¨

static __declspec(dllexport) double mul(double a, double b);//³Ë·¨

static __declspec(dllexport) double div(double a, double b);//³ý·¨

__declspec(dllexport) void print();

};

Éú³É¶¯Ì¬¿âÐèÒªÉèÖù¤³ÌÊôÐÔ£¬´ò¿ª¹¤³Ì¡°ÊôÐÔÃæ°å¡±¨¨¡±ÅäÖÃÊôÐÔ¡±¨¨¡±³£¹æ¡±£¬ÅäÖÃÀàÐÍÑ¡Ôñ¶¯Ì¬¿â¡£

ͼ£ºv¶¯Ì¬¿âÏîÄ¿ÊôÐÔÉèÖÃ

BuildÏîÄ¿¼´¿ÉÉú³É¶¯Ì¬¿â¡£

ʹÓö¯Ì¬¿â

´´½¨win32¿ØÖÆÌ¨²âÊÔ³ÌÐò£º

TestDynamicLibrary.cpp²âÊÔ³ÌÐò

#include "stdafx.h"

#include "DynamicMath.h"

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

double a = 10;

double b = 2;

cout << "a + b = " << DynamicMath::add(a, b) << endl;

cout << "a - b = " << DynamicMath::sub(a, b) << endl;

cout << "a * b = " << DynamicMath::mul(a, b) << endl;

cout << "a / b = " << DynamicMath::div(a, b) << endl;

DynamicMath dyn;

dyn.print();

system("pause");

return 0;

}

·½·¨Ò»£º

¹¤³Ì¡°ÊôÐÔÃæ°å¡±¨¨¡°Í¨ÓÃÊôÐÔ¡±¨¨ ¡°¿ò¼ÜºÍÒýÓᱨ¨¡±Ìí¼ÓÒýÓá±£¬½«ÏÔʾ¡°Ìí¼ÓÒýÓá±¶Ô»°¿ò¡£¡°ÏîÄ¿¡±Ñ¡ÏÁгöÁ˵±Ç°½â¾ö·½°¸Öеĸ÷¸öÏîÄ¿ÒÔ¼°¿ÉÒÔÒýÓõÄËùÓп⡣ ÔÚ¡°ÏîÄ¿¡±Ñ¡ÏÖУ¬Ñ¡Ôñ DynamicLibrary¡£ µ¥»÷¡°È·¶¨¡±¡£

Ìí¼ÓDynamicMath.h Í·ÎļþĿ¼£¬±ØÐëÐ޸İüº¬Ä¿Â¼Â·¾¶¡£´ò¿ª¹¤³Ì¡°ÊôÐÔÃæ°å¡±¨¨¡±ÅäÖÃÊôÐÔ¡±¨¨ ¡°C/C++¡±¨¨¡± ³£¹æ¡±£¬ÔÚ¡°¸½¼Ó°üº¬Ä¿Â¼¡±ÊôÐÔÖµÖУ¬¼üÈëDynamicMath.h Í·ÎļþËùÔÚĿ¼µÄ·¾¶»òä¯ÀÀÖÁ¸ÃĿ¼¡£

±àÒëÔËÐÐOK¡£

ͼ£º¶¯Ì¬¿â²âÊÔ½á¹û£¨vs£©

·½·¨¶þ£º

¡°ÊôÐÔÃæ°å¡±¨¨¡±ÅäÖÃÊôÐÔ¡±¨¨ ¡°Á´½ÓÆ÷¡±¨¨¡±³£¹æ¡±£¬¸½¼ÓÒÀÀµ¿âĿ¼ÖÐÊäÈ룬¶¯Ì¬¿âËùÔÚĿ¼£»

¡°ÊôÐÔÃæ°å¡±¨¨¡±ÅäÖÃÊôÐÔ¡±¨¨ ¡°Á´½ÓÆ÷¡±¨¨¡±ÊäÈ롱£¬¸½¼ÓÒÀÀµ¿âÖÐÊäÈ붯̬¿â±àÒë³öÀ´µÄDynamicLibrary.lib¡£

ÕâÀï¿ÉÄÜ´ó¼ÒÓиöÒÉÎÊ£¬¶¯Ì¬¿âÔõô»¹ÓÐÒ»¸öDynamicLibrary.libÎļþ£¿¼´ÎÞÂÛÊǾ²Ì¬Á´½Ó¿â»¹ÊǶ¯Ì¬Á´½Ó¿â£¬×îºó¶¼ÓÐlibÎļþ£¬ÄÇôÁ½ÕßÇø±ðÊÇÊ²Ã´ÄØ£¿Æäʵ£¬Á½¸öÊÇÍêÈ«²»Ò»ÑùµÄ¶«Î÷¡£

StaticLibrary.libµÄ´óСΪ190KB£¬DynamicLibrary.libµÄ´óСΪ3KB£¬¾²Ì¬¿â¶ÔÓ¦µÄlibÎļþ½Ð¾²Ì¬¿â£¬¶¯Ì¬¿â¶ÔÓ¦µÄlibÎļþ½Ð¡¾µ¼Èë¿â¡¿¡£Êµ¼ÊÉϾ²Ì¬¿â±¾Éí¾Í°üº¬ÁËʵ¼ÊÖ´ÐдúÂë¡¢·ûºÅ±íµÈµÈ£¬¶ø¶ÔÓÚµ¼Èë¿â¶øÑÔ£¬Æäʵ¼ÊµÄÖ´ÐдúÂëλÓÚ¶¯Ì¬¿âÖУ¬µ¼Èë¿âÖ»°üº¬Á˵ØÖ··ûºÅ±íµÈ£¬È·±£³ÌÐòÕÒµ½¶ÔÓ¦º¯ÊýµÄһЩ»ù±¾µØÖ·ÐÅÏ¢¡£

¶¯Ì¬¿âµÄÏÔʽµ÷ÓÃ

ÉÏÃæ½éÉܵĶ¯Ì¬¿âʹÓ÷½·¨ºÍ¾²Ì¬¿âÀàËÆÊôÓÚÒþʽµ÷Ó㬱àÒëµÄʱºòÖ¸¶¨ÏàÓ¦µÄ¿âºÍ²éÕÒ·¾¶¡£Æäʵ£¬¶¯Ì¬¿â»¹¿ÉÒÔÏÔʽµ÷Óᣡ¾ÔÚCÓïÑÔÖС¿£¬ÏÔʾµ÷ÓÃÒ»¸ö¶¯Ì¬¿âÇá¶øÒ×¾Ù£¡

ÔÚLinuxÏÂÏÔʽµ÷Óö¯Ì¬¿â

#include <dlfcn.h>£¬ÌṩÁËÏÂÃæ¼¸¸ö½Ó¿Ú£º

void * dlopen( const char * pathname, int mode )£ºº¯ÊýÒÔÖ¸¶¨Ä£Ê½´ò¿ªÖ¸¶¨µÄ¶¯Ì¬Á¬½Ó¿âÎļþ£¬²¢·µ»ØÒ»¸ö¾ä±ú¸øµ÷Óýø³Ì¡£

void* dlsym(void* handle,const char* symbol)£ºdlsym¸ù¾Ý¶¯Ì¬Á´½Ó¿â²Ù×÷¾ä±ú(pHandle)Óë·ûºÅ(symbol)£¬·µ»Ø·ûºÅ¶ÔÓ¦µÄµØÖ·¡£Ê¹ÓÃÕâ¸öº¯Êý²»µ«¿ÉÒÔ»ñÈ¡º¯ÊýµØÖ·£¬Ò²¿ÉÒÔ»ñÈ¡±äÁ¿µØÖ·¡£

int dlclose (void *handle)£ºdlcloseÓÃÓڹرÕÖ¸¶¨¾ä±úµÄ¶¯Ì¬Á´½Ó¿â£¬Ö»Óе±´Ë¶¯Ì¬Á´½Ó¿âµÄʹÓüÆÊýΪ0ʱ,²Å»áÕæÕý±»ÏµÍ³Ð¶ÔØ¡£

const char *dlerror(void)£ºµ±¶¯Ì¬Á´½Ó¿â²Ù×÷º¯ÊýÖ´ÐÐʧ°Üʱ£¬dlerror¿ÉÒÔ·µ»Ø³ö´íÐÅÏ¢£¬·µ»ØÖµÎªNULLʱ±íʾ²Ù×÷º¯ÊýÖ´Ðгɹ¦¡£

ÔÚWindowsÏÂÏÔʽµ÷Óö¯Ì¬¿â

Ó¦ÓóÌÐò±ØÐë½øÐк¯Êýµ÷ÓÃÒÔÔÚÔËÐÐʱÏÔʽ¼ÓÔØ DLL¡£ÎªÏÔʽÁ´½Óµ½ DLL£¬Ó¦ÓóÌÐò±ØÐ룺

µ÷Óà LoadLibrary£¨»òÏàËÆµÄº¯Êý£©ÒÔ¼ÓÔØ DLL ºÍ»ñȡģ¿é¾ä±ú¡£

µ÷Óà GetProcAddress£¬ÒÔ»ñȡָÏòÓ¦ÓóÌÐòÒªµ÷ÓõÄÿ¸öµ¼³öº¯ÊýµÄº¯ÊýÖ¸Õë¡£ÓÉÓÚÓ¦ÓóÌÐòÊÇͨ¹ýÖ¸Õëµ÷Óà DLL µÄº¯Êý£¬±àÒëÆ÷²»Éú³ÉÍⲿÒýÓ㬹ÊÎÞÐèÓëµ¼Èë¿âÁ´½Ó¡£

ʹÓÃÍê DLL ºóµ÷Óà FreeLibrary¡£

ÏÔʽµ÷ÓÃC++¶¯Ì¬¿â×¢Òâµã

¶ÔC++À´Ëµ£¬Çé¿öÉÔ΢¸´ÔÓ¡£ÏÔʽ¼ÓÔØÒ»¸öC++¶¯Ì¬¿âµÄÀ§ÄÑÒ»²¿·ÖÊÇÒòΪC++µÄname mangling£»ÁíÒ»²¿·ÖÊÇÒòΪûÓÐÌṩһ¸öºÏÊʵÄAPIÀ´×°ÔØÀ࣬ÔÚC++ÖУ¬Äú¿ÉÄÜÒªÓõ½¿âÖеÄÒ»¸öÀ࣬¶øÕâÐèÒª´´½¨¸ÃÀàµÄÒ»¸öʵÀý£¬Õâ²»ÈÝÒ××öµ½¡£

name mangling¿ÉÒÔͨ¹ýextern "C"½â¾ö¡£C++ÓиöÌØ¶¨µÄ¹Ø¼ü×ÖÓÃÀ´ÉùÃ÷²ÉÓÃC bindingµÄº¯Êý£ºextern "C" ¡£Óà extern "C"ÉùÃ÷µÄº¯Êý½«Ê¹Óú¯ÊýÃû×÷·ûºÅÃû£¬¾ÍÏñCº¯ÊýÒ»Ñù¡£Òò´Ë£¬Ö»ÓзdzÉÔ±º¯Êý²ÅÄܱ»ÉùÃ÷Ϊextern "C"£¬²¢ÇÒ²»Äܱ»ÖØÔØ¡£¾¡¹ÜÏÞÖÆ¶à¶à£¬extern "C"º¯Êý»¹ÊǷdz£ÓÐÓã¬ÒòΪËüÃÇ¿ÉÒÔÏóCº¯ÊýÒ»Ñù±»dlopen¶¯Ì¬¼ÓÔØ¡£¹ÚÒÔextern "C"ÏÞ¶¨·ûºó£¬²¢²»Òâζן¯ÊýÖÐÎÞ·¨Ê¹ÓÃC++´úÂëÁË£¬Ïà·´£¬ËüÈÔÈ»ÊÇÒ»¸öÍêÈ«µÄC++º¯Êý£¬¿ÉÒÔʹÓÃÈκÎC++ÌØÐԺ͸÷ÖÖÀàÐ͵IJÎÊý¡£

¡°ÏÔʽ¡±Ê¹ÓÃC++¶¯Ì¬¿âÖеÄClassÊǷdz£·±ËöºÍΣÏÕµÄÊÂÇ飬Òò´ËÄÜÓá°Òþʽ¡±¾Í²»ÒªÓá°ÏÔʽ¡±£¬Äܾ²Ì¬¾Í²»ÒªÓö¯Ì¬¡£

   
3479 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
Visual C++±à³ÌÃüÃû¹æÔò
ÈκÎʱºò¶¼ÊÊÓõÄ20¸öC++¼¼ÇÉ
CÓïÑÔ½ø½×
´®¿ÚÇý¶¯·ÖÎö
ÇáÇáËÉËÉ´ÓCһ·×ßµ½C++
C++±à³Ì˼Ïë


C++²¢·¢´¦Àí+µ¥Ôª²âÊÔ
C++³ÌÐò¿ª·¢
C++¸ß¼¶±à³Ì
C/C++¿ª·¢
C++Éè¼ÆÄ£Ê½
C/C++µ¥Ôª²âÊÔ


±±¾© ǶÈëʽC¸ßÖÊÁ¿±à³Ì
Öйúº½¿Õ ǶÈëʽC¸ßÖÊÁ¿±à³Ì
»ªÎª C++¸ß¼¶±à³Ì
±±¾© C++¸ß¼¶±à³Ì
µ¤·ð˹ C++¸ß¼¶±à³Ì
±±´ó·½Õý CÓïÑÔµ¥Ôª²âÊÔ
ÂÞ¿ËΤ¶û C++µ¥Ôª²âÊÔ