详解vs2022创建及调用.lib的方法
MINO吖 人气:0静态库
1. 静态库对函数库的链接是在编译期完成的。执行期间代码装载速度快。
2. 使可执行文件变大,浪费空间和资源(占空间)。
3. 对程序的更新、部署与发布不方便,需要全量更新。如果 某一个静态库更新了,所有使用它的应用④程序都需要重新编译、发布给用户。
动态库
1. 动态库把对一些库函数的链接载入推迟到程序运行时期(占时间)。
2. 可以实现进程之间的资源共享。(因此动态库也称为共享库)
3. 将一些程序升级变得简单,不需要重新编译,属于增量更新。
1. 创建静态库(.lib)
添加一个“静态库” 的新项目 - StaticLib1。
预编译头选择“不使用预编译头”。
pch.h:
选择使用预编译头文件的话,要创建对应的预编译头文件,并且在源文件中要引用预编译头文件。否则会报错。
staticLib1.h
#ifndef STATIC_LIB #define STATIC_LIB #include <iostream> using namespace std; void fnStaticLib1(); class StaticOne { int age; public: StaticOne() {}; StaticOne(int a); void sayHello(); }; #endif // !STATIC_LIB
staticLib1.cpp
#include <iostream> #include "pch.h" void fnStaticLib1() { std::cout << "fnStaticLib1!" << std::endl; } StaticOne::StaticOne(int a) : age(a) {}; void StaticOne::sayHello() { std::cout << "Hello, C++." << std::endl; };
右键项目,点击生成;并提示成功
2. 创建应用程序(.exe)
index.cpp
#include "staticLib1.h" #pragma comment(lib, "StaticLib1.lib") void main() { StaticOne a(1); a.sayHello(); fnStaticLib1(); }
3. 调用lib
3.1 方法1
3.1 通过调整文件路径实现调用
如上的index.cpp,肯定是会提示找不到对应的文件的。
所以可以将静态库的 .h和.lib 文件拷贝到.exe项目下,就可以正常运行了。
但是每次修改静态库代码后,重新生成.lib都要手动复制文件过来很麻烦。
可以修改index.cpp(具体根据自己的目录调整):
#include "../StaticLib1/staticLib1.h" #pragma comment(lib, "../x64/Debug/StaticLib1.lib")
3.2 方法2
3.2 通过更改目录配置,让编译器可以在正确的目录读取到文件,然后引入。以此实现调用
3.1方法中不论是拷贝粘贴文件,还是使用路径引入文件都不太友好。
那么可以在.exe项目的属性页中对.h和.lib的目录进行配置。
- .h 头文件目录的配置项(任选一个配置即可):
- VC++目录 - 包含目录
- C/C++ - 附加包含目录
- .lib 库文件目录的配置项(任选一个配置即可):
- VC++目录 - 库目录
- 链接器 - 附加库目录
配置好(附加)包含目录和(附加)库目录之后,将 index.cpp代码改为如下即可。
不需要写相对、绝对路径,因为编译器会在配置的(附加)包含目录和(附加)库目录中进行读取。
#include "staticLib1.h" #pragma comment(lib, "StaticLib1.lib")
甚至,可以3.1和3.2混合使用,只配置包含目录,不配置库目录。.lib文件通过相对/绝对路径进行引入。
3.3 方法三
3.3是在3.2的基础上,增加"附加依赖项"的配置,去掉pragma
通过3.2对目录进行配置之后就可以正常运行了。
但是每次在调用时除了引入.h之外,还要通过pragma comment引入.lib,也不太友好。
那么在3.2的基础上,我们可以在属性页中对依赖的库进行配置(链接器 - 输入 - 附加依赖项)
填入.lib的名称。
index.cpp
#include "staticLib1.h" void main() { ... }
这样就不需要再填写pragma comment了。
3.4 方法四
3.4通过vs“引用”实现调用
1. 引入.h文件(通过路径引入或目录配置都可)
2. 添加引用 ,勾选对应的静态库
index.cpp
#include "staticLib1.h" void main() { ... }
调用Lib的原则就是:可以让编译器找到头文件和库文件的目录,并正确引入。
只要符合这一点,以上方法可以任意搭配使用。
加载全部内容