Windows Visual Studio中静态库与动态库加载

本文详细解释了VS项目中静态库和动态库的配置,包括包含目录、库目录、附加目录和依赖项的设置,以及静态库与动态库加载的区别和方法。特别强调了如何正确配置静态库、动态库的隐式加载和显示加载,以提高程序的可移植性和性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VS项目中的包含目录库目录附加包含目录附加库目录附加依赖项在项目->属性->配置属性下进行配置,具体说明如下:

1 静态库加载

1.1 VC++目录

包含目录:即语句#include<xxxx.h>中的头文件xxxx.h的搜索目录
库目录:即.lib文件的搜索目录

1.2 C/C++:

常规->附加包含目录:即语句#include<xxxx.h>中的头文件xxxx.h的搜索目录(多项之间用分号;分割)

1.3 链接器:

常规->附加库目录:寻找.lib文件的搜索目录
输入->附加依赖项lib库文件名(Tips: C++的库一般会把函数、类等声明放在*.h头文件中,具体函数、类等实现放在*.cpp或*.cc中。编译之后,.cpp,.cc,*.c会被打包成一个.lib文件,这样可以保护源代码)

1.4 配置区别

  1. 包含目录vs附加包含目录库目录vs附加库目录的区别
    包含目录:修改了系统的include宏的值,是全局的;
    附加包含目录:用于当前项目,对其他项目没有影响。
    注意:库目录附加库目录的区别同上;

  2. 包含目录vs附加包含目录库目录vs附加库目录的区别主要在于全局还是仅针对当前工程;若仅需要对某工程进行配置,则在附加包含目录附加库目录中添加即可。
    注意:要使用一个库,除了要include其头文件以外(附加包含目录),还要在链接过程中把lib加进去,即需要配置附加库目录附加依赖项(库文件名)。

1.5 某工程具体配置方法

为了提高程序的可移植性,通常会将第三库放在解决方案(.sln)或者工程(.vcxproj)文件所在的文件夹下;添加目录的时候添加相对目录,这样在其他电脑上运行时就不会出现配置的问题了。

注意:相对路径是针对工程文件(*.vcxproj)而言的。

  1. 附加包含目录—添加工程的头文件目录:
    项目->属性->配置属性->C/C++ ->常规->附加包含目录:加上头文件的存放目录;
  2. 附加库目录—添加文件引用的lib静态库路径:
    项目->属性->配置属性->链接器->常规->附加库目录:加上lib文件的存放目录;
  3. 附加依赖项—添加工程引用的lib文件名:
    项目->属性->配置属性->链接器->输入->附加依赖项:加上lib文件名。

附加依赖项也可直接给带有路径(相对路径 或 绝对路径)的lib文件,此时无需配置附加库目录

2 动态库加载

与静态库不同,动态库的加载有2种方式,分为隐式加载显示加载

2.1 隐式加载

所需文件:接口.h头文件dll文件lib文件
.h文件.lib文件的加载方式与静态库加载完全一致。但.dll文件必须放在环境变量指定的目录下,通常是与目标.exe文件放在同一目录下。

2.2 显示加载

所需文件:.h文件dll文件。理论上不需要.h头文件,但是前提是明确知道函数接口。
利用LoadLibrary()函数进行加载、利用FreeLibrary()函数进行卸载。如图2 动态库显式加载与卸载范例

2.3 两种加载方式区别

  1. 显示加载使用灵活,需要时加载,用完卸载;
  2. 隐式加载伴随着整个程序的生命周期。

总结

库分为静态库动态库

  1. 静态库可执行文件.exe打包,动态库可执行文件.exe独立。
  2. 静态库加载需要:.lib文件.h文件;
  3. 动态库隐式加载需要.dll文件.h文件.lib文件;
  4. 动态库显示加载只需要.dll文件

Windows Visual Studio中静态库与动态库加载 - 羊大葱 - 博客园 (cnblogs.com)

使用VS2015编译和调用动态链接库dll 1. 首先建工程,选择dll,记得勾上“导出符号” 后面不用自己搞那些宏定义会省事很多。 建立工程myDll,记得勾上“导出符号” 类型选择dll 2. IDE自动生成的代码已经把整个架构弄好了,其中和项目同名的.h和.cpp文件就是我们自己写代码的地方了。我想写的dll是导出一个类,在这里我就直接在它自动生成的CmyDll类上面改了。 myDll.h myDll.cpp 在mydll.h和mydll.cpp中给类添加成员函数 //mydll.h class MYDLL_API CmyDll { public: CmyDll(void); // TODO: 在此添加您的方法。 int myFunction(int a, int b); }; //mydll.cpp int CmyDll::myFunction(int a, int b) { return a*b; } 3.编译的时候我选择了release,这里可以用默认的debug也行 在mydll.h和mydll.cpp中给类添加成员函数 最后生成解决方案后产生的mydll.lib和mydll.dll就是我们需要的二进制文件了。lib文件是编译是要用的,而dll是调用这个库的程序运行时需要的。 调用dll 1.重新建立一个工程 这回选择普通的控制台程序就行了。我建了个名为myDllCall的工程。 2.把库的头文件include进来,以及连接lib文件 其中 include进来的 myDll.h 和 **#pragma comment()**的lib根据自己的路径写。 #include "stdafx.h" #include "../../myDll/myDll/myDll.h" //头文件 #pragma comment(lib,"../../myDll/Release/myDll.lib") //调用自己写的外部库 #include int main() { CmyDll mydll; int a, b; std::cin >> a >> b; std::cout << mydll.myFunction(a, b) <> a >> b; std::cout << mydll.myFunction(a, b) << std::endl; return 0; } 3.dll放到可执行文件同一目录下面 刚刚的代码直接编译没问题,运行会报错. 直接编译没问题,运行会报错 原因是dll要和生成的可执行文件在同一个目录下,我把mydll.dll放进去之后就解决了。 我们成功的在自己的工程里调用了外部的类 可以看到我们成功的在自己的工程里调用了外部的类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值