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静态库目标文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在头文件Hello1.h中声明(以供其他文件#include后实现声明的效果),在实现文件Hello1.cpp中实现,由于生成的lib静态库文件不是exe可执行文件所以不能运行。
在这里插入图片描述
在这里插入图片描述

#2、建立项目B使生成dll动态目标文件
在这里插入图片描述
在头文件ProjectB_dll.h中声明,在实现文件ProjectB_dll.cpp中实现,由于生成的dll动态库文件不是exe可执行文件所以不能执行。
在这里插入图片描述
在这里插入图片描述
#3 建立项目C使生成可执行exe文件
在这里插入图片描述
#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中的函数定义,运行通过:
在这里插入图片描述
##4.2 仍然在项目C的"stdafx.h"中引用项目A的头文件"Hello1.h",实现声明的目的,这样项目C所有#include “stdafx.h”;了的.cpp都能达到声明项目A中"Hello1.h"中函数声明的目的。当然也可以只声明要调用的来自lib静态库的函数而不用包含声明。使用VS2010的项目属性-附加库目录包含项目A的ProjectA_lib.lib静态库文件所在目录,注意文件夹符号是’‘而不是从Windows资源管理器中复制来的’/’:
在这里插入图片描述
使用VS2010的项目属性-附加依赖项包含项目A的ProjectA_lib.lib静态库文件:
在这里插入图片描述
编译、运行通过:
在这里插入图片描述
#5 使用项目B的dll动态库文件
使用dll动态库需要首先为编译阶段链接到dllexport导出函数,这需要采用链接lib静态库文件的方式将伴随dll文件一齐生成的同名.lib文件首先链接,然后将项目B生成的dll拷贝到项目C生成的.exe可执行文件所在目录(必须是同目录下,在上层目录或子目录中就会提示找不到带dll动态库文件的错误!),则运行时exe会自动在其所在目录中找寻与lib静态库文件同名的dll并调用其中项目C要导入的(同时项目B也予以导出)的函数或变量:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将项目B生成的dll拷贝到项目C生成的.exe可执行文件所在目录(必须是同目录下,在上层目录或子目录中就会提示找不到带dll动态库文件的错误!)
在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++/CLI中引用C++ dll有两种方式: 1. 静态链接 可以将C++ dll编译为静态库(.lib文件),然后在C++/CLI项目中将其链接为静态库,这样就可以在C++/CLI项目中直接调用C++ dll中的函数。 具体步骤如下: 1. 将C++ dll编译为静态库(.lib文件)。 2. 在C++/CLI项目中,右键单击项目名称,选择"属性"。 3. 在"属性"对话框中,选择"常规",然后在"附加包含目录"中添加C++ dll的头文件路径,在"附加库目录"中添加C++ dll的库文件路径。 4. 在"链接器"->"输入"中,将C++ dll的库文件名称添加到"附加依赖项"中。 5. 在C++/CLI项目中,可以使用以下代码来调用C++ dll中的函数: ```cpp #include "MyNativeLibrary.h" using namespace System; namespace MyCppCliLibrary { public ref class MyManagedClass { public: void CallMyFunction() { // 调用C++函数 MyFunction(); } }; } ``` 在上述代码中,`MyFunction`是一个在C++ dll中定义的函数,`MyManagedClass`是一个托管类,`CallMyFunction`方法直接调用`MyFunction`函数。 2. 动态链接 可以将C++ dll编译为动态链接库(.dll文件),然后在C++/CLI项目中使用动态链接库加载函数来调用C++ dll中的函数。 具体步骤如下: 1. 将C++ dll编译为动态链接库(.dll文件)。 2. 在C++/CLI项目中,使用以下代码来动态加载C++ dll: ```cpp #include <windows.h> typedef void(*MYFUNCTION)(); using namespace System; namespace MyCppCliLibrary { public ref class MyManagedClass { public: void CallMyFunction() { // 加载C++ dll HMODULE hModule = LoadLibrary(L"mylibrary.dll"); if (hModule == NULL) { // 加载失败 return; } // 获取C++函数指针 MYFUNCTION MyFunction = (MYFUNCTION)GetProcAddress(hModule, "MyFunction"); if (MyFunction == NULL) { // 获取失败 return; } // 调用C++函数 MyFunction(); // 卸载C++ dll FreeLibrary(hModule); } }; } ``` 在上述代码中,`MyFunction`是C++ dll中的函数,`MyManagedClass`是一个托管类,`CallMyFunction`方法使用`LoadLibrary`函数加载C++ dll,使用`GetProcAddress`函数获取`MyFunction`函数的指针,然后直接调用函数。最后,使用`FreeLibrary`函数卸载C++ dll。 需要注意的是,在使用动态链接库加载函数调用C++ dll时,需要使用`LoadLibrary`函数加载C++ dll,并使用`GetProcAddress`函数获取函数指针,然后在调用完毕后使用`FreeLibrary`函数卸载C++ dll。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值