【转】VS2015 动态链接库&&静态链接库
首先介绍一下静态库(静态链接库)、动态库(动态链接库)的概念,首先两者都是代码共享的方式。
静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件。
动态库:动态链接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件。
那么上述静态库和动态库中的lib有什么区别呢?
静态库中的lib:该LIB包含函数代码本身(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中。
动态库中的lib:该LIB包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供。
总之,lib是编译时用到的,dll是运行时用到的。如果要完成源代码的编译,只需要lib;如果要使动态链接的程序运行起来,只需要dll。
一.动态链接库
1.创建动态链接库
<1>新建项目--win32项目--填写项目名mydll--确定--下一步--应用程序类型:选择dll--附加选项:选择导出符号--完成
<2>创建头文件my.h my.cpp
头文件:
1 #pragma once 2 #ifdef MYDLL_EXPORTS 3 #define MYDLL_API __declspec(dllexport) 4 #else 5 #define MYDLL_API __declspec(dllimport) 6 #endif 7 8 #include <iostream> 9 #include <string> 10 11 using namespace std; 12 13 class MYDLL_API GOODS 14 { 15 public: 16 GOODS::GOODS(); 17 GOODS::~GOODS(); 18 19 int setname(string name); 20 21 int setnum(int num); 22 23 int setperunit(int perunit); 24 25 int printinfo(); 26 27 int getcost(); 28 29 private: 30 string m_name; 31 int m_num; 32 int m_perunit; 33 }; 34 // 整数加法和乘法 35 int Add(int a, int b); 36 int Mul(int c, int d);
cpp文件:
1 #include "goods.h" 2 3 GOODS::GOODS() 4 {} 5 6 GOODS::~GOODS() 7 {} 8 9 int GOODS::setname(string name) 10 { 11 m_name = name; 12 13 return 0; 14 } 15 16 int GOODS::setnum(int num) 17 { 18 m_num = num; 19 return 0; 20 } 21 22 int GOODS::setperunit(int perunit) 23 { 24 m_perunit = perunit; 25 return 0; 26 } 27 28 int GOODS::printinfo() 29 { 30 cout << "name: " << m_name << endl; 31 cout << "num: " << m_num << endl; 32 cout << "perunit: " << m_perunit << endl; 33 34 return 0; 35 } 36 37 int GOODS::getcost() 38 { 39 int cost = m_num*m_perunit; 40 return cost; 41 } 42 43 int Add(int a, int b) { 44 return a + b; 45 } 46 int Mul(int c, int d) { 47 return c * d; 48 }
<3>生成解决方案,解决方案生成my.dll 和my.lib
2.使用动态链接库
调用动态库:隐式链接
隐式链接需要.h文件,dll文件,lib文件
(1)将dll放到工程的工作目录
(2)设置项目属性--vc++目录--库目录为lib所在的路径
(3)将lib添加到项目属性--链接器--输入--附加依赖项(或者直接在源代码中加入#pragma comment(lib, “**.lib”))
(4)在源文件中添加.h头文件
然后就像平常一样调用普通函数、类、变量
二.静态链接库
1.创建静态链接库
<1>新建项目--win32项目--填写项目名--确定--下一步--应用程序类型:选择静态库 创建项目后添加.h文件,添加相应的导出函数、变量或类,如下所示
<2>创建头文件my.h my.cpp
头文件:
1 #ifndef _MYLIB_H_ 2 #define _MYLIB_H_ 3 4 void fun(int a); 5 6 extern int k; 7 8 class testclass 9 { 10 public: 11 testclass(); 12 void print(); 13 }; 14 15 #endif
cpp文件:
1 #include "stdafx.h" 2 #include "lib.h" 3 #include <iostream> 4 5 void fun(int a) 6 { 7 std::cout<<a<<"lib gen\n"; 8 } 9 10 int k = 222; 11 12 testclass::testclass() 13 { 14 std::cout<<"123\n"; 15 } 16 17 void testclass::print() 18 { 19 std::cout<<"this is testcalss\n"; 20 }
<3>编译工程后就会生成一个.lib文件
2.使用静态库
需要.h文件,lib文件
(1)设置项目属性--vc++目录--库目录为lib所在的路径
(2)将lib添加到项目属性--链接器--输入--附加依赖项(或者直接在源代码中加入#pragma comment(lib, “**.lib”))
(3)在源文件中添加.h头文件
然后就像平常一样调用普通函数、类、变量,举例如下:
1 #include <iostream> 2 #include "lib.h" 3 4 #pragma comment(lib, "lib.lib") 5 6 int main() 7 { 8 fun(4); 9 std::cout<<k<<std::endl; 10 testclass tc; 11 tc.print(); 12 return 0; 13 }
————————————————
原文链接:https://blog.csdn.net/qq_17239003/article/details/78482145