静态库
生成lib静态库文件,头文件的函数声明不需要__declspec(dllexport)和__declspec(dllimport)和普通头文件一样即可
新建静态库项目
头文件
#ifndef TESTLIB_H
#define TESTLIB_H
//防止头文件重复包含
//条件编译指令
int add(int a, int b);
#endif // !TESTLIB_H
cpp文件
#include "testlib.h"
int add(int a, int b)
{
return a + b;
}
编译生成lib静态库文件
新建项目测试静态库
配置静态库目录
链接需要的静态库
有两种方式
1.在代码中加入 #pragma comment(lib, "testlib")
2.项目属性中配置
#include <stdio.h>
#include "../testlib/testlib.h"
//#pragma comment(lib, "testlib")
int main()
{
printf("测试加法:%d\n", add(4, 5));
getchar();
return 0;
}
动态库
动态库会生成3个重要的文件,dll库文件,lib导出库文件(和静态库不同虽然后缀名相同),头文件
动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要(动态加载dll,即:)自己LoadLibary调入DLL文件,然后再手工GetProcAddress获得对应函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。
导入库和静态库的区别很大,他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
新建动态库项目
#ifndef TESTDLL_H
#define TESTDLL_H
//如果没有定义这个宏
#ifndef _DLLAPI
//导出
#define DLLAPI __declspec(dllexport)
#else
//导入
#define DLLAPI __declspec(dllimport)
#endif // !
//声明导出函数
int DLLAPI add(int a, int b);
int DLLAPI sub(int a, int b);
//使用C语言导出 保持函数名 在使用动态加载库时很重要
//extern "C" int DLLAPI add(int a, int b);
#endif // !TESTDLL_H
cpp文件
#include "testdll.h"
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
使用动态库也有两种方式
1.隐式调用
新建测试项目
配置导入库目录
链接导入库
#pragma comment(lib, "testdll")
或者
#include "stdafx.h"
#include <stdio.h>
#include "../testdll/testdll.h"
//这个不是真正的静态库(导入库),提供导出函数 隐式调用静态库
//#pragma comment(lib, "testdll")
int main()
{
int a = 2;
int b = 3;
printf("%d\n", add(a, b));
getchar();
return 0;
}
//还可以使用LoadLibrary动态加载dll 然后使用 GetProcAddress()获取函数指针 FreeLibrary释放
还可以使用LoadLibrary动态加载dll 然后使用 GetProcAddress()获取函数指针 FreeLibrary释放