一、通晓概念
在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即可,其他皆相同。