原文链接:http://blog.csdn.net/xiaoding133/article/details/8973436
一、静态链接库和动态链接库
1.静态链接库(.LIB):函数和数据被编译进一个二进制文件。发布时,只需要发布这个可执行文件,并不需要发布被使用的静态库。
2.动态库(.DLL):在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件和一个DLL(.dll)。虽然引入库和静态库的后缀名相同,但是差别很大。对于一个DLL来说,其引入库文件包含该DLL导出的函数和变量的符号名,而.dll文件包含DLL的实际的函数和数据。在使用动态链接库的情况下,在编译链接可执行文件时,只需要DLL的引入库文件,而在运行可执行程序时,需要加载所需要的DLL,“发布产品时,需要发布调用的动态链接库”。
二、静态链接库的创建和引用
【创建静态库】
//DLL.h头文件声明2个函数:一个在.cpp中实现,一个在.c中实现
#ifndef _LIB_H_
#define _LIB_H_
#ifdef __cplusplus
#include <iostream>
using namespace std;
extern "C"
{
#endif
int add(int a, int b);
void show();
#ifdef __cplusplus
};
#endif
#endif
------------------------------------------------------------------------------------------
//define_add.cpp中实现add()函数
#include "LIB.h"
int add(int a,int b)
{
#ifdef __cplusplus
printf("DLL生成使用成功:add()函数 —— C++编译环境\n");
return a+b;
#else
printf("DLL生成使用成功:add()函数 —— C编译环境\n");
return a+b;
#endif
}
------------------------------------------------------------------------------------------
//define_show.c中实现show()函数
#include "LIB.h"
void show()
{
#ifdef __cplusplus
printf("\nDLL生成使用成功:show()函数 —— C++编译环境\n");
#else
printf("\nDLL生成使用成功:show()函数 —— C编译环境\n");
#endif
}
【注解】创建和调用LIB与DLL的相同点、不同点
与创建动态库DLL相同点:
可以实现C与C++的混合编程#ifdef __cplusplus extern "C"{#endif //函数的声明 #ifdef __cplusplus }#endif 、
创建LIB静态库时,在.h声明函数,.c或.cpp中实现函数,.c或.cpp中调用函数 、
#ifdef...#else...#endif(#ifdef __cplusplus...#else...#endif) 、
防止重定义头文件#ifndef...#define...#endif 、
#define
与创建动态库DLL不同点:
__declspec(dllexport)不是必须的(是可有可无),但是在创建DLL时该关键字是必须的。
===========================================================================================
【使用静态库LIB.lib】
将上面生成的LIB.lib和LIB.h文件拷贝到新建工程项目的目录下,并且添加下面代码:
//main.c调用LIB.lib中的2个函数
#include "LIB.h"
#pragma comment(lib,"LIB.lib")
int main()
{
printf("add(1,2) = %d\n",add(1,2));
show();
getchar();
}
---------------------------------------------------------
//main.cpp调用LIB.lib中的2个函数
#include "LIB.h"
#pragma comment(lib,"LIB.lib")
int main()
{
cout<<"add(1,2) = "<<add(1,2)<<endl;
show();
getchar();
}
【仔细一点你会发现:在main.c和main.cpp代码中输出部分有微小差别】因为main.c文件中没有cout、endl等关键字,所以我们用stdio.h里边的关键字printf进行输出。