网站专题设计稿,seo站外推广有哪些,设计说明模版,青岛网站定制多少钱【图书推荐】《Linux C与C一线开发实践#xff08;第2版#xff09;》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践#xff08;第2版#xff09;#xff08;Linux技术丛书#xff09;》(朱文伟#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com…【图书推荐】《Linux C与C一线开发实践第2版》_linux c与c一线开发实践pdf-CSDN博客《Linux C与C一线开发实践第2版Linux技术丛书》(朱文伟李建英)【摘要 书评 试读】- 京东图书 (jd.com)
【图书介绍】】几本Linux系统管理与开发图书_linux应用开发书籍-CSDN博客
10.3.1 静态库的基本概念
静态库文件的后缀为.a在Linux下一般命名为libxxx.a。当有程序使用某个静态库时在链接步骤中链接器将从静态库文件中取得的代码复制到生成的可执行文件中即整个库中的所有函数都被链接到可执行文件中。因此使用静态库的可执行文件通常较大。但使用静态库的优点也非常明显即可执行程序最终运行时不需要和该库有关的文件的支持因为所有使用的函数都已经被编译进去了可执行文件可以直接运行。当然有时候这也是一个缺点比如静态库里的内容改变了那么程序调用者必须重新编译。
10.3.2 静态库的创建和使用
通常使用ar命令来创建静态库。通过ar命令其实就是把一些目标文件.o组合在一起成为一个单独的静态库。Linux上创建静态库的步骤如下
1编辑源文件比如.c或.cpp文件。
2通过gcc -c xxx.c或g -c xxx.cpp生成目标文件即.o文件。
3用ar归档目标文件生成静态库。
4配合静态库写一个头文件文件里的内容就是提供给外面使用的函数、变量或类的声明。
要学会创建静态库主要是学会ar命令的使用。ar命令不但可以创建静态库还可以修改或提取已有静态库中的信息。它的常见用法如下
ar [option] libxxx.a xx1.o xx2.o xx3.o ...
其中option是ar命令的选项libxxx.a是生成的静态库文件的名字xxx通常是我们自己设定的名字lib是一种习惯静态库通常以lib开头后面的xx1.o、xx2.o、xx3.o是要归档进静态库中的目标代码文件可以有多个所以后面用省略号。
常用选项如下
1选项c用来创建一个库。无论库是否存在都将创建。
2选项s创建目标文件索引这在创建较大的库时能加快时间。如果不需要创建索引可改成大写S参数如果.a文件缺少索引还可以使用ranlib命令添加。
3选项r在库中插入模块若插入的模块名已经在库中存在则将替换同名的模块。如果若干模块中有一个模块在库中不存在ar就会显示一个错误消息并不会替换其他同名模块。默认情况下新的成员增加在库的结尾处可以使用其他任意选项来改变增加的位置。
4选项t显示库文件中有哪些目标文件。注意只显示名称。
5选项tv显示库文件中有哪些目标文件。显示的信息包括文件名、时间、大小等。
6选项s显示静态库文件中的索引表。
要使用静态库很简单下面我们来看一个例子生成一个静态库并使用它。
【例10.1】创建并使用静态库g版
1打开Visual Studio Code新建一个源文件test.cpp内容如下
#include stdio.h#include iostreamusing namespace std;void f(int age){cout your age is age endl;printf(age:%d\n,age);}
代码很简单。这个源码文件主要作为静态库。我们首先将test.cpp文件上传到Linux在命令行下输入以下命令
# g -c test.cpp
此时会在test.cpp同目录下生成test.o目标文件。再输入以下命令来生成静态库
# ar rcs libtest.a test.o
其中ar是静态函数库创建的命令c是create创建的意思rs前面都有解释。
此时会在同目录下生成libtest.a静态库文件。注意所要生成的.a文件的名字前3位最好是lib否则在链接的时候就可能找不到这个库。
2现在静态库生成了我们另外编写一个源文件来使用该库中的函数f。打开Visual Studio Code新建一个文件main.cpp并输入如下代码
extern void f(int age); // 声明要使用的函数#include iostreamusing namespace std;int main(int argc, char *argv[]){f(66);cout HI endl;return 0;}
代码很简单。首先声明一下f然后就可以在main函数中使用了。保存文件后将其上传到Linux注意要和libtest.a放在同一个目录然后在命令行进行编译并运行
# g -o main main.cpp -L. -ltest# ./mainyour age is 66age:66HI
编译运行成功了。其中-L用来告诉g去哪里找库文件它后面加了一个点.表示在当前目录下去找库文件-l用来指定具体的库其中的lib和.a不用显式写出g或gcc会自动去寻找libtest.a这也是我们前面生成静态库的时候静态库的文件名要用lib前缀的原因。默认情况下g或gcc首先搜索动态库.so文件找不到后再去寻找静态库.a文件。当前目录没有动态库文件因此可以找到静态库文件。
gcc和g使用静态库的过程类似下面列举一个gcc版本的例子。
【例10.2】创建并使用静态库gcc版
1打开Visual Studio Code新建一个源文件test.cpp内容如下
#include stdio.hvoid f(int age){printf(age:%d\n,age);}
这个源码文件主要作为静态库。我们首先将test.c文件上传到Linux在命令行下输入如下命令
# gcc -c test.cpp
此时会在test.cpp同目录下生成test.o目标文件。再输入以下命令来生成静态库
# ar rcs libtest.a test.o
此时会在同目录下生成libtest.a静态库文件。
2现在静态库生成了我们另外编写一个源文件来使用该库中的函数f。打开Visual Studio Code新建一个文件main.cpp并输入如下代码
extern void f(int age); // 声明要使用的函数int main(int argc, char *argv[]){f(66);return 0;}
代码很简单首先声明一下f然后就可以在main函数中使用了。保存代码后将其上传到Linux注意要和libtest.a放在同一个目录然后在命令行进行编译并运行
# gcc -o main main.cpp -L. -ltest# ./mainage:66
编译运行成功了。其中-L用来告诉gcc去哪里找库文件它后面加了一个点.表示在当前目录下去找库文件-l用来指定具体的库其中的lib和.a不用显式写出g或gcc会自动去寻找libtest.a。默认情况下g或gcc首先搜索动态库.so文件找不到后再去寻找静态库.a文件。当前目录没有动态库文件因此可以找到静态库文件。