C++(GCC)生成和使用静态库
文章目录
- C++(GCC)生成和使用静态库
- 1、前言
- 1.1 什么是静态库
- 1.2 静态库优缺点
- 1.3 C++使用静态库的方法
- 1.4 注意事项
- 2、linux下C++生成静态库.a
- 3、链接使用静态库
更多精彩内容 |
---|
👉个人内容分类汇总 👈 |
1、前言
1.1 什么是静态库
- 静态库是一种包含已编译对象文件的归档文件,它们可以被链接到一个可执行文件中。
- 静态库通常使用文件扩展名
.a
(Unix),静态库的命名约定为“lib<library_name>.a”或.lib
(Windows)。- 静态库的原理是将多个目标文件打包成一个单独的文件,它可以与其他目标文件链接,并在运行时一起生成可执行文件。
- 这样做的好处是,静态库中的代码可以在编译时与目标文件捆绑在一起,形成一个可执行文件,使得可执行文件不需要再依赖于静态库来运行。
- 因此,静态库的代码被复制到了可执行文件中,使得运行效率更高、更加稳定。
1.2 静态库优缺点
静态库是一种可重复使用的代码库,它将一组函数和变量打包在一起,并在链接时静态地嵌入到可执行文件中。
与动态库不同,静态库的代码在运行时不需要额外的加载和解析操作。
静态库的优点:
性能优势:由于静态库的代码被直接嵌入到可执行文件中,因此在运行时没有额外的加载和解析操作。这使得程序在启动和运行时更快。
可移植性好:静态库不依赖于系统中已经安装的库。这意味着,当你要在另一个环境中编译或运行你的程序时,你不必担心缺少所需的库文件。
简单易用:使用静态库时,只需将库文件链接到可执行文件中即可。这很容易实现并且不会引入复杂度。
版本控制方便:由于静态库被直接嵌入到可执行文件中,因此每个可执行文件都可以包含所需版本的库。这意味着你可以轻松地将不同版本的库与不同版本的应用程序捆绑在一起,而无需担心版本冲突。
静态库的缺点:
占用空间:由于静态库的代码被嵌入到可执行文件中,因此每个可执行文件都包含了一份完整的库代码。这可能会导致可执行文件变得很大,尤其是当使用多个静态库时。
更新困难:当库的代码发生更改时,必须重新编译和链接所有依赖该库的应用程序。这使得更新过程较为繁琐。如果一个库是非常通用的并且在许多应用程序中使用,那么它的更新可能需要花费很多时间。
无法动态更新:由于静态库的代码被静态地嵌入到可执行文件中,因此在运行时不能动态更新库的代码。这意味着,当需要修复库中的错误或添加新功能时,必须重新构建整个应用程序。
1.3 C++使用静态库的方法
在Linux下使用C++静态库的步骤如下:
编写代码并编译成目标文件(.o),比如
g++ -c test.cpp -o test.o
。然后使用
ar
命令将编译生成的.o
文件打包成静态库文件(.a),比如ar rcs libtest.a test.o
。
- ar是一个用于创建、修改和提取归档文件的命令行工具。归档文件是一种将多个文件组合成单个文件的方式,通常用于将多个目标文件组合为一个库文件(如静态库)或者打包多个文件以备份或分发。
r
表示插入新成员(如果原来不存在的话);c
表示创建新档案;s
表示将插入的成员作为符号表保存。编写使用静态库的代码,并链接静态库,比如
g++ -o main main.cpp -L. -ltest
。
-L.
表示在当前目录搜索库文件;-lmylib
表示链接名为libmylib.a
的静态库。运行可执行程序,比如
./test
。
1.4 注意事项
在C++中使用静态库时需要注意以下事项:
- 静态库是一组已编译的代码,因此要确保静态库与你所使用的C++编译器和操作系统兼容。否则,可能会导致链接错误或运行时崩溃。
- 在编译时,需要指定静态库的路径和名称。在Visual Studio中,可以通过项目属性的“链接器”选项卡来设置这些信息。
- 如果在多个项目中使用同一个静态库,建议将其复制到一个公共目录,以便所有项目都可以访问它。
- 静态库的头文件应该包含在项目中,并且应该正确地包含在源文件中。如果未正确包含头文件,则编译器将无法找到函数和变量声明,这将导致编译错误。
- 在使用静态库时,需要确保库的版本与你的代码兼容。如果你更改了你的代码,可能需要重新编译库以确保它与最新的代码兼容。
- 如果你使用的是第三方静态库,则需要查看其文档以了解如何正确使用它。有些静态库需要在编译时启用特殊的标志或链接其他库,以便正常工作。
2、linux下C++生成静态库.a
-
创建用于生成静态库的test.h文件
#ifndef __TEST__ #define __TEST__ int testFun(int a, int b); #endif
-
创建用于生成静态库的test.cpp文件
#include "test.h" int testFun(int a, int b) { return a + b; }
-
使用下列命令将test.cpp文件编译成二进制目标文件
g++ -c test.cpp -o test.o
-
使用下列命令
ar rcs libtest.a test.o
3、链接使用静态库
-
创建一个使用静态库的main.cpp文件;
#include <iostream> #include "test.h" using namespace std; int main() { cout << testFun(10, 20) << endl; return 0; }
-
使用下列命令编译main.cpp,并链接静态库libtest.a
g++ main.cpp -o main -L. -ltest
-
使用
./main
运行编译后的可执行程序