Linux C/C++编程之静态库
【图书推荐】《Linux C与C++一线开发实践(第2版)》_linux c与c++一线开发实践pdf-CSDN博客
《Linux C与C++一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)
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 <iostream>
using 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 <iostream>
using 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
# ./main
your age is 66
age:66
HI
编译运行成功了。其中,-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.h>
void 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
# ./main
age:66
编译运行成功了。其中,-L用来告诉gcc去哪里找库文件,它后面加了一个点(.),表示在当前目录下去找库文件;-l用来指定具体的库,其中的lib和.a不用显式写出,g++或gcc会自动去寻找libtest.a。默认情况下,g++或gcc首先搜索动态库(.so)文件,找不到后再去寻找静态库(.a)文件。当前目录没有动态库文件,因此可以找到静态库文件。

Linux C/C++编程之静态库的更多相关文章
- Win32编程之静态库编写与使用.动态链接库的编写与使用
Win32编程之静态库编写与使用.动态链接库的编写与使用 一丶什么是静态库.什么是动态链接库. 静态库其实就是解决模块开发的一种解决方案.在以前.我们写代码的时候.每个人都可以独立写一个项目.但是现在 ...
- zt:我使用过的Linux命令之ar - 创建静态库.a文件
我使用过的Linux命令之ar - 创建静态库.a文件 本文链接:http://codingstandards.iteye.com/blog/1142358 (转载请注明出处) 用途说明 创建静 ...
- C 高级编程3 静态库与动态库
http://blog.csdn.net/Lux_Veritas/article/details/11934083http://www.cnblogs.com/catch/p/3857964.html ...
- Linux命令之ar - 创建静态库.a文件和动态库.so
转自:http://blog.csdn.net/eastonwoo/article/details/8241693 用途说明 创建静态库.a文件.用C/C++开发程序时经常用到,但我很少单独在命令行中 ...
- linux下 GCC编译链接静态库&动态库
静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...
- Linux下编译、使用静态库和动态库 自己测过的
每个程序实质上都会链接到一个或者多个的库.比如使用C函数的程序会链接到C运行时库,GUI程序会链接到窗口库等等.无论哪种情况,你都会要决定是链接到静态库(static libary)还是动态库(dyn ...
- Linux中创建和使用静态库&动态库
库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行 Linux下库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在 ...
- Linux下制作和使用静态库和动态库
概述 Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库.linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib. 静态函数库: 这类库的名字一般是libxxx. ...
- Yuchuan_Linux_C 编程之三 静态库的制作和使用
一.整体大纲 二.静态库的制作 1)命名规则 lib + 库的名字 + .a 例如:libyuchuan.a2)制作步骤: 1). 生成对应的.o文件 -- ...
- 手把手教你调试Linux C++ 代码(一步到位包含静态库和动态库调试)
手把手教你调试Linux C++ 代码 软件调试本身就是一项相对复杂的活动,他不仅要求调试者有着清晰的思路,而且对调试者本身的技能也有很高的要求.Windows下Visual Studio为我们做了很 ...
随机推荐
- Vue3比Vue2快的体现-第二部分
这部分主要说两个方面,1是静态提升,2是事件监听缓存 静态提升意思就是说,在以往Vue执行函数的时候,无论是绑定数据的节点还是没有绑定的,都会在render函数执行的时候重新渲染,如下代码所示 imp ...
- 【SpringBoot Demo】MySQL + JPA + Hibernate + Springboot + Maven Demo
主要包含:springboot+jpa+hibernate+mysql+lombok (两年前写过一个,现在重新记录一个) 1. 目录结构: 2. pom 文件 1 <?xml version= ...
- 【基础知识】【转】彻底搞懂 async & defer
普通 script 先来看一个普通的 script 标签. <script src="a.js"></script> 浏览器会做如下处理 停止解析 docu ...
- 搭建ipv6并发代理池
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 学习目标 ounter(l ...
- Asp.net core 学习笔记 dotnet & azure 常用 command
更新: 2021-08-26 最近试了一下 vs 2022 结果 .net cli 也自动升级到 .net 6 preview 版本, 害我 dotnet new 的时候出来一个 .net 6 tem ...
- Azure 入门系列 (第三篇 Publish Web Application to VM)
本系列 这个系列会介绍从 0 到 1 搭建一个 Web Application 的 Server. 间中还会带上一些真实开发常用的功能. 一共 6 篇 1. Virtual Machine (VM) ...
- logisim学习感想(持续更新)
状态机类型 存在两种类型的状态机,分别为mealy型状态机和moore型状态机,在实验中,二者的大体实现如下: 其中从输入到输出的连线只有mealy状态机才有,而moore型则无此线. 区分两种类型的 ...
- SVN(Linux)提交时强制写日志
SVN(Linux)提交时强制写日志 1.创建并修改pre-commit文件 进入svn/code/hooks目录,在svn版本库的hooks文件夹下面,复制模版pre-commit.tmplcp p ...
- .NET 实现的交互式 OA 系统
前言 近期,我们在后台收到了粉丝们的留言,需要一个高效办公自动化(OA)系统.为了回应大家的期待,今天我们推荐一款既灵活又强大的 OA 系统解决方案,帮助提升日常办公效率和团队协作水平. 在日常工作中 ...
- 2022年第十八届 GOPS 全球运维大会资料分享
全球运维大会是国内第一个运维行业大会,面向互联网.金融.通信及传统行业广大运维技术人员,旨在传播先进技术思想和理念,分享业内最佳实践. 2022年第十八届 GOPS 全球运维大会(深圳站)共分为18个 ...