C++静态库的创建和使用 ——实战

一、通晓概念

在Linux下有静态库和动态库之分。

静态库在程序编译时会被链接到目标代码,目标程序运行时不再需要动态库,移植方便,体积大,浪费空间和资源,因为所有相关的对象文件与牵涉的库被链接成一个可执行文件,这样导致可执行文件的体积较大。

动态库在程序编译时并不会链接到目标程序中,而是在程序运行时被加载,因此体积小。有了动态库,程序升级变得相对简单,比如某个动态库升级了,只需要更换这个动态文件,而不需要去更换可执行文件。可执行文件是动态库的调用者。

静态库文件的后缀是.a,在Linux下一般命名为libxxx.a。当有程序使用某个链接库时,在链接步骤中,连接器将从静态库文件取得的代码复制到生成的可执行文件中,即整个库中的所有函数都被链接到可执行文件中。因此静态库的可执行文件通常较大。

静态库的优点: 可执行程序最终运行时不需要和该库有关的文件支持,因为所有使用使用的函数已经被编译进去,可执行文件可以直接运行了。

静态库的缺点:静态库内容改变了,那么整个程序的调用者必须重新编译。

Linux创建静态库的步骤如下:

1、编辑源文件(例如 .c 和 .cpp文件)。

2、通过gcc -c xxx.c 或者 g++ -c xxx.cpp生成目标文件(即.o文件)。

3、用ar归档目标文件,生成静态库。

4、配合静态库写一个头文件,文件的内容就是提供给外部使用的函数、变量、或类的声明。

二、进行实战(g++创建)

1、创建test.cpp

#include <iostream>
#include <stdio.h>
using namespace std;
void fun(int age)
{
    cout << "your age is " << endl;
    printf("age:%d\n",age);
}

2、生成test.o(切换到test.cpp当前目录下进行)

root@zhangziniu-dt:/mnt/d/ProjectCode/Code/StaticDemo# g++ -c test.cpp

3、生成libtest.a静态库

root@zhangziniu-dt:/mnt/d/ProjectCode/Code/StaticDemo# ar rcs libtest.a test.o

注意:所生成的.a文件的名字前3位必须是lib,否则在连接时,就可能导致找不到文件。

4、编写main.cpp文件

#include <iostream>
using namespace std;
void fun(int age);
int main()
{
    fun(66);
    cout<<"Hi"<<endl;
    return 0;
}

5、编译运行

root@zhangziniu-dt:/mnt/d/ProjectCode/Code/StaticDemo# g++ -o main main.cpp -L. -ltest
root@zhangziniu-dt:/mnt/d/ProjectCode/Code/StaticDemo# ./main
your age is 
age:66
Hi

6、说明

-L:用来告诉g++去哪里找库文件,它后面的点,表示在当前目录去找库文件。

-l:用来指定具体的库,其中lib和.a不用显示写出,g++和gcc会自动去寻找libtest.a,这也是前面生成静态库文件名要用lib前缀的原因。

注意:test.cpp文件中不要写main函数,不然必会报错。

7、gcc

使用gcc和g++一样,只要把g++换成gcc即可,其他皆相同。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值