首页 > 系统相关 >Linux C/C++编程之静态库

Linux C/C++编程之静态库

时间:2024-12-02 10:59:06浏览次数:7  
标签:文件 静态 age 编程 C++ test Linux cpp main

【图书推荐】《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)文件。当前目录没有动态库文件,因此可以找到静态库文件。

 

标签:文件,静态,age,编程,C++,test,Linux,cpp,main
From: https://www.cnblogs.com/brucexia/p/18581218

相关文章

  • linux将命令挂在后台执行
    在日常工作中,可能会需要执行一些脚本,数据备份,数据迁移等短时间无法结束的任务,最好将其挂后台执行,这样可以保证命令的持续性,确保任务不受终端异常状态影响最佳实践eg:nohupCommand>output.log2>&1&">"符号用于将命令的`标准输出`重定向到指定的文件中>outlog.log表示将......
  • Linux C/C++编程之动态库
    【图书推荐】《LinuxC与C++一线开发实践(第2版)》_linuxc与c++一线开发实践pdf-CSDN博客《LinuxC与C++一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要书评试读】-京东图书(jd.com)10.4.1 动态库的基本概念动态库又称为共享库。这种类型的库的命名规则一般是libx......
  • Linux的一些常用命令
    1.查看系统信息系统版本uname-acat/etc/redhat-release查看CPUlscpu内存free-h硬盘df-Th 2.firewall防火墙启动:systemctlstartfirewalld查状态:systemctlstatusfirewalld停止:systemctldisablefirewalld禁用:systemctlstopfirewalld在开机时启用一......
  • linux ln命令详解
    介绍ln是linux的一个重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接。当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复......
  • Linux常用的文件操作命令
    目录在Linux系统中,文件操作是日常任务的重要组成部分。下面是一些常用的命令行工具,用于创建、查看、编辑和管理文件。touch-创建空文件或更新文件的时间戳touch文件名cp-复制文件或目录cp[选项]源文件目标文件less/more-分页查看文件内容less文件名......
  • Java基础全解:构建扎实编程技能
    文章目录1.HelloWorld程序深入解析:2.数据类型深入解析:3.条件判断深入解析:4.循环结构深入解析:5.数组深入解析:6.方法定义与调用深入解析:1.HelloWorld程序深入解析:类声明:publicclassHelloWorld定义了一个公共类。public关键字意味着这个类可以......
  • Kali Linux怎么开python虚拟环境
    相信很多朋友再学习的过程中都会遇到一些pip失效,或者报错的时候,他们要求我们要使用虚拟环境,但是不知道怎么搭建,下面这篇文章就来告诉你如何搭建虚拟环境,这个方法在所有Linux的服务器都通用,就两行命令安装venv模块(Python3.3及以上版本自带,无需安装)python3-mvenvmyenv......
  • 百度的面试官,你什么勾八水平,也好意思上车锁门 面试官:说一下C++强制类型转换,C++内存管
    ......
  • linux进程管理
    一、进程数据结构和组织二、进程切换三、进程创建四、进程调度进程是一个程序运行的实例,操作系统通过并行和并发的运行多个进程实现多个任务的并行处理;从系统资源的角度看,多个进程同时运行时,操作系统以进程为单位来分配系统资源(比如CPU时间、内存等);     进程作为系......
  • linux好玩又没用的命令
    原文地址:linux好玩又没用的命令–无敌牛欢迎参观我的个人博客:无敌牛–技术/著作/典籍/分享等介绍linux环境下几款好玩但又没用的命令,使用linux系统的时候增加一些乐趣。1、cmatrix黑客帝国电影中,字符动画的效果安装:aptinstallcmatrix测试直接执行cmatrix开......