美文网首页
动态库静态库生成及显式隐式调用

动态库静态库生成及显式隐式调用

作者: 冀望的air | 来源:发表于2020-10-26 14:39 被阅读0次

    动态库

    首先新建一个dll动态库


    1.png

    然后建立一个.h头文件,加入函数

    
     #ifdef 函数名_EXPORTS  
     #define 函数名_API __declspec(dllexport)  
     #else  
     #define 函数名_API __declspec(dllimport)  
     #endif    
    

    隐式调用

    ·项目->属性->配置属性->VC++ 目录-> 在“包含目录”里添加头文件project2.h所在的目录


    配置头文件.png

    ·项目->属性->配置属性->VC++ 目录-> 在“库目录”里添加头文件project2.lib所在的目录

    库目录.png

    ·项目->属性->配置属性->链接器->输入-> 在“附加依赖项”里添加“project2.lib”(若有多个 lib 则以逗号隔开)

    lib文件.png

    ·隐式调用源文件必须加上'#define TESTDLL_EXPORTS//不进行宏定义,或提示链接不一致,导致隐式调用失败'

    显式调用

    直接上函数

    
    dllfun lucky;      //先是定一个函数指针 dllfun;然后通过GetProcAdress来获取函数的地址  
    HINSTANCE hDLL;               //定一个句柄实例,用来取DLL的实例地址  
    hDLL = LoadLibrary("C:\\Users\\Pomelo\\Desktop\\caculater\\caculator\\Debug\\multiply.dll");//加载动态链接库MyDll.dll文件;     
    if (hDLL == NULL)                             //取的地址要判断,返回的句柄是否为空,  
    {                       //如果为无效句柄,那么要释放加载DLL所占用的内存  
        printf("无法载入dll\n");  
        FreeLibrary(hDLL);  
        return 0;  
    }  
    lucky = (dllfun)GetProcAddress(hDLL, "?Multiply@@YAMMM@Z"); //参数是DLL的句柄和你要调用的函数名  
    if (lucky == NULL)  //这里也要判断要函数指针是否为空,如果没取到要求的函数,那么要释放句柄  
    {  
        printf("无法获取函数地址\n");  
        FreeLibrary(hDLL);  
        return 0;  
    }  
    c1 = lucky(a, b);                              //调用compute函数,指向函数运算结果  
    cout << a << "*" << b << "的值为:" << c1 << endl;         //输出最后计算结果  
    FreeLibrary(hDLL);  
    

    静态库

    静态库建立方法和动态库一样,选择静态库。
    静态库的调用只需要在属性中vc/c++添加包含目录(.h文件路径)和库目录(.lib)文件路径,连接器常规加入依赖项.lib文件名。

    lib.png

    相关文章

      网友评论

          本文标题:动态库静态库生成及显式隐式调用

          本文链接:https://www.haomeiwen.com/subject/hbmamktx.html