day1 – 静态库和动态库

静态库

使用功能但是不提供源码的方式一:提供头文件和obj文件
obj文件的使用方式:
1) 直接拖到VS工程
2) 在 链接器->输入->附加依赖项 中添加

使用obj,同时兼容c和c++的做法

#ifdef __cplusplus
extern "C" {
#endif
  
int Add(int n1, int n2);

#ifdef __cplusplus
}
#endif

静态库:
使用方式 – 除了obj的两种方式外,还可以通过代码#pragma comment(lib, “mylib.lib”)

静态库缺点:
1) 如果lib有更新,使用的工程如需应用更新,则必须重新编译
2) 磁盘冗余
3) 其他语言无法使用动态库(dll,so) 导出函数

动态库

动态库使用:
1) 拷贝头文件
2) 拷贝lib
3) 拷贝dll

头文件兼容导入和导出的方式:

#ifdef MYDLL_EXPORT
#define  MYDLLAPI __declspec(dllexport)
#else
#define  MYDLLAPI __declspec(dllimport)
#endif

1.“动态库”通常是在Windows下的说法,Linux下通常有另外一个名称“共享库”。

2.静态库、动态库不仅可以作用于类,也可以作用于函数。本质上应该是“”作用于函数,作用于类时,实际上是作用于类的成员函数。

隐式加载

首先创建一个工程,命名为 cDemo,添加源文件 main.c,内容如下:

#include<stdio.h>

_declspec(dllimport) int add(int, int);
_declspec(dllimport) int sub(int, int);

int main(){
    int a=10, b=5;
    printf("a+b=%d\n", add(a, b));
    printf("a-b=%d\n", sub(a, b));
    return 0;
}

找到上节创建的 dllDemo 工程,将 debug 目录下的 dllDemo.lib 和 dllDemo.dll 复制到当前工程目录下。

.lib 文件包含DLL导出的函数和变量的符号名,只是用来为链接程序提供必要的信息,以便在链接时找到函数或变量的入口地址;.dll 文件才包含实际的函数和数据。所以首先需要将 dllDemo.lib 引入到当前项目。
在源码中引入 .lib 文件,如下所示:

#pragma comment(lib, "dllDemo.lib")

显示加载

LoadLibrary
GetProcAddress
FreeLibrary

HMODULE hMod = LoadLibrary("mydll.dll");
    if (hMod == NULL)
    {
        std::cout << "mydll 加载失败" << std::endl;
        return 0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值