C++引用lib静态库的两种方式

当项目C调用项目A的函数或使用项目A的全局变量,变量虽然可以用写文件再读文件的方式“传递”,但诸如此类需求非常多,频繁读写文件是很low的法子,也不符合全栈开发的理念。也不能将项目A中该函数及其所依赖部分再到项目B中拷贝一份(.h与.cpp),这不符合代码重用原则,此时链接项目A的生成lib静态库文件或生成dll动态库文件是不错的选择,其中dll项目也可链接lib静态库文件,并且链接dll动态库文件能实现模块开发,更新软件时可以用新版dll替换旧版dll(只要该dll动态库文件有导出调用其的函数或变量)。
更规范且通用的Visual Studio编译器实现dll动态库链接方式详见微软在线技术文档:演练:创建和使用自己的动态链接库(C ++),其中利用了DLL项目的新项目模板预定义的"ProjectName.h"的ProjectName_EXPORTS宏,使DLL项目中包含"ProjectName.h"的文件自动进行了 __declspec(dllexport)的导出函数声明,而在其他项目包含该DLL项目的"ProjectName.h"时由于没有定义ProjectName_EXPORTS宏,会自动进行__declspec(dllimport)的导入函数声明,这样只用包含头文件的方式就实现了导出、导入函数声明,并且统一使用DLL项目的"ProjectName.h"头文件,实现了代码重用,避免了重复修改。
#1、建立项目A使输出lib静态库目标文件
C++引用lib静态库的两种方式_第1张图片
C++引用lib静态库的两种方式_第2张图片
C++引用lib静态库的两种方式_第3张图片
在头文件Hello1.h中声明(以供其他文件#include后实现声明的效果),在实现文件Hello1.cpp中实现,由于生成的lib静态库文件不是exe可执行文件所以不能运行。
C++引用lib静态库的两种方式_第4张图片
C++引用lib静态库的两种方式_第5张图片

#2、建立项目B使生成dll动态目标文件
C++引用lib静态库的两种方式_第6张图片
在头文件ProjectB_dll.h中声明,在实现文件ProjectB_dll.cpp中实现,由于生成的dll动态库文件不是exe可执行文件所以不能执行。
C++引用lib静态库的两种方式_第7张图片
C++引用lib静态库的两种方式_第8张图片
#3 建立项目C使生成可执行exe文件
C++引用lib静态库的两种方式_第9张图片
#4 使用项目A的静态lib生成文件的两种方式

使用#pragma comment(lib,"***.lib")或者VS编译器附加库目录+附加依赖项的方式都可以。
##4.1 在项目C的"stdafx.h"中引用项目A的头文件"Hello1.h",实现声明的目的,这样项目C所有#include “stdafx.h”;了的.cpp都能达到声明项目A中"Hello1.h"中函数声明的目的。当然也可以只声明要调用的来自lib静态库的函数而不用包含声明。然后在项目C的"stdafx.cpp"中引用项目A生成的lib静态库文件"ProjectA_lib.lib",关于静态库lib文件包含什么以及与.cpp、.obj文件的关系,详见Spring_24同学介绍dll和lib的区别,从而能在其中找到项目A的所有.cpp中函数实现,使编译通过,然后在项目C的输出的exe可执行文件中存有所调用了的项目A中的函数定义,运行通过:
C++引用lib静态库的两种方式_第10张图片
##4.2 仍然在项目C的"stdafx.h"中引用项目A的头文件"Hello1.h",实现声明的目的,这样项目C所有#include “stdafx.h”;了的.cpp都能达到声明项目A中"Hello1.h"中函数声明的目的。当然也可以只声明要调用的来自lib静态库的函数而不用包含声明。使用VS2010的项目属性-附加库目录包含项目A的ProjectA_lib.lib静态库文件所在目录,注意文件夹符号是’‘而不是从Windows资源管理器中复制来的’/’:
C++引用lib静态库的两种方式_第11张图片
使用VS2010的项目属性-附加依赖项包含项目A的ProjectA_lib.lib静态库文件:
C++引用lib静态库的两种方式_第12张图片
编译、运行通过:
C++引用lib静态库的两种方式_第13张图片
#5 使用项目B的dll动态库文件
使用dll动态库需要首先为编译阶段链接到dllexport导出函数,这需要采用链接lib静态库文件的方式将伴随dll文件一齐生成的同名.lib文件首先链接,然后将项目B生成的dll拷贝到项目C生成的.exe可执行文件所在目录(必须是同目录下,在上层目录或子目录中就会提示找不到带dll动态库文件的错误!),则运行时exe会自动在其所在目录中找寻与lib静态库文件同名的dll并调用其中项目C要导入的(同时项目B也予以导出)的函数或变量:
C++引用lib静态库的两种方式_第14张图片
C++引用lib静态库的两种方式_第15张图片
C++引用lib静态库的两种方式_第16张图片
将项目B生成的dll拷贝到项目C生成的.exe可执行文件所在目录(必须是同目录下,在上层目录或子目录中就会提示找不到带dll动态库文件的错误!)
C++引用lib静态库的两种方式_第17张图片

你可能感兴趣的:(C++)