VS2019VC++静态库的开发与使⽤
前⾔
这篇⽂章应该写在这个系列⾥⾯的:。
但当时没写,只写了动态链接的相关内容,是因为我认为静态链接相⽐较动态链接会简单得多,所以⼲脆就略过了。既然有⼈提问了,那我就简单的开发流程和主要遇到的问题来讲讲静态库的开发。
⾸先总体来看,静态库和动态库的区别在于:
1. 静态库只出现在项⽬的编译⽣成的链接期,⽽动态库则是程序运⾏时加载使⽤的;
2. 静态库只有⼀个.lib⽂件,⽽动态库除了⼀个.dll⽂件以外⼀般还有个对应的.lib⽂件;
3. 静态库最后会内嵌到输出的.exe或.dll中,⽽动态库是外挂使⽤;
4. 静态库是没有链接器的,因为静态库不需要链接,所以你即便有些符号没有到实现也不会报错。
VS2019创建静态库
1. ⾸先创建⼀个控制台程序StaticLibTest,过程省略,我之前的⽂章有很多介绍。
2. 添加静态库项⽬,StaticLib1:
到这⾥两个项⽬创建起来了,但是两个项⽬间是毫⽆联系的,下⾯⽤链接器让StaticLibTest使⽤StaticLib1⽣成的静态库。
1. 在StaticLibTest中的链接器中添加StaticLib1的⽣成路径:
这个路径实际上就是整个解决⽅案的⽣成路径,.exe也⽣成在这⾥。我这⾥就没有做lib和bin分开的项⽬管理了。
2. 在输⼊中加⼊StaticLib1.lib
3. 在StaticLibTest.cpp中加⼊fnStaticLib1的调⽤,这个函数是VS⾃动⽣成的,在StaticLib1.cpp下⾯,根据你的项⽬名不同,这个函数名也不⼀样:
4. 添加项⽬依赖关系:
这⾥是为两个项⽬在⽣成的时候绑定了依赖关系,StaticLibTest在⽣成前⼀定会检查StaticLib1是不是最新的⽣成。很多⼈出现的问题⼤多数都是由于静态库没有⽣成更新导致的,这是很愚蠢的问题。
5. 直接调试运⾏(先⽣成StaticLib1.lib再⽣成):
这样就链接好了,⾮常简单。
静态库的理解
为了⼤家更好的理解静态库,我这⾥做个等效测试。
1. 在控制台项⽬中添加⼀个a.cpp⽂件,内容如下:
//a.cpp//
const char* filename = "a.cpp";
//const char* filename = __FILE__;
int codeline = 2;
mysql下载的vs库放在那个文件里//int codeline = __LINE__;
const char* GetFunctionName()
{
return "GetFunctionName";
//return __FUNCTION__;
}
注释掉的代码后⾯再解释,这是编译器为我们提供的⽅便。
2. 在StaticLibTest.cpp中添加这三个变量函数的调试打印:
StaticLibTest.cpp/
#include <iostream>
void fnStaticLib1();
extern const char* filename;
//const int codeline = 2;
extern int codeline;
const char* GetFunctionName();
int main()
{
std::cout << "Hello World!\n";
fnStaticLib1();
std::cout << filename << std::endl;
std::cout << codeline << std::endl;
std::cout << GetFunctionName() << std::endl;
}
注意这⾥我没有⽤const int,因为它不参与链接,只在当前⽂件可见。为什么const char*可以?读者可以思考下。
3. 打印结果是:
4. 我把a.cpp直接添加到StaticLib1中,⽽在StaticLibTest中移出掉。即这个⽂件编译在静态库中,不在控制台项⽬中编译,如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。