首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux 静态库如何使用

Linux静态库是一种将多个目标文件打包成一个单独文件的机制,以便在编译时链接到应用程序中。静态库通常具有.a扩展名,并且包含预编译的代码,这些代码可以直接嵌入到最终的可执行文件中。

基础概念

静态库:在程序编译时会被完整地复制到可执行文件中,因此生成的可执行文件会包含所有必要的库函数。

动态库:在程序运行时才被加载,多个程序可以共享同一个动态库实例,节省内存空间。

使用静态库的优势

  1. 性能优化:由于静态库在编译时被链接,程序启动时不需要额外的加载时间。
  2. 简化部署:可执行文件包含了所有必要的代码,不需要在目标系统上安装额外的库。
  3. 避免版本冲突:每个程序都包含自己的库副本,不会受到其他程序的影响。

类型

  • 归档文件(.a):静态库的标准格式。
  • 对象文件(.o):编译后的单个源文件。

应用场景

  • 嵌入式系统:由于资源有限,静态链接可以减少运行时的依赖。
  • 安全性要求高的应用:静态链接可以防止库文件被篡改。
  • 性能敏感的应用:减少运行时的开销。

如何使用静态库

创建静态库

假设你有两个源文件file1.cfile2.c,你想将它们编译成一个静态库。

代码语言:txt
复制
gcc -c file1.c -o file1.o
gcc -c file2.c -o file2.o
ar rcs libmylib.a file1.o file2.o

这里ar命令用于创建归档文件,rcs选项分别代表r(替换)、c(创建)和s(生成索引)。

使用静态库

假设你有一个主程序main.c,你想链接上面创建的静态库。

代码语言:txt
复制
gcc main.c -L. -lmylib -o myprogram
  • -L. 表示在当前目录下查找库文件。
  • -lmylib 表示链接名为libmylib.a的库(注意lib前缀和.a后缀不需要指定)。

遇到的问题及解决方法

问题:找不到静态库文件

原因:可能是库文件路径不正确,或者库文件名拼写错误。

解决方法

  • 确保库文件存在于指定的路径中。
  • 使用-L选项指定正确的库路径。
  • 检查-l选项后的库名是否正确(不包括lib前缀和.a后缀)。

问题:链接时出现未定义的引用

原因:可能是库文件中没有包含所需的符号,或者链接顺序不正确。

解决方法

  • 确保所有需要的源文件都已编译并包含在静态库中。
  • 检查链接命令中的库顺序,依赖库应该放在被依赖库的前面。

示例代码

假设我们有以下两个源文件:

file1.c

代码语言:txt
复制
#include <stdio.h>

void print_hello() {
    printf("Hello from file1!\n");
}

file2.c

代码语言:txt
复制
#include <stdio.h>

void print_world() {
    printf("World from file2!\n");
}

创建静态库:

代码语言:txt
复制
gcc -c file1.c -o file1.o
gcc -c file2.c -o file2.o
ar rcs libmylib.a file1.o file2.o

主程序main.c

代码语言:txt
复制
#include <stdio.h>

void print_hello();
void print_world();

int main() {
    print_hello();
    print_world();
    return 0;
}

链接并运行:

代码语言:txt
复制
gcc main.c -L. -lmylib -o myprogram
./myprogram

这将输出:

代码语言:txt
复制
Hello from file1!
World from file2!

通过这种方式,你可以有效地使用Linux静态库来组织和分发你的代码。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

linux动态库和静态库的使用_静态库的使用

文章目录 动静态库的基本原理 认识动静态库 动静态库各自的特征 静态库的打包与使用 打包 使用 动态库的打包与使用 打包 使用 动静态库的基本原理 动静态库的本质是可执行程序的“半成品...认识动静态库 在Linux下创建文件编写以下代码,并生成可执行程序。...在Linux下,我们可以通过ldd 文件名来查看一个可执行程序所依赖的库文件。...此时我们可以看到,libc-2.17.so实际上就是一个共享的目标文件库,准确来说,这还是一个动态库。 在Linux当中,以.so为后缀的是动态库,以.a为后缀的是静态库。...缺点: 使用静态库生成可执行程序会占用大量空间,特别是当有多个静态程序同时加载而这些静态程序使用的都是相同的库,这时在内存当中就会存在大量的重复代码。

4.8K20
  • 【Linux】动静态库

    静态库 静态库是一种在编译阶段将库文件的内容直接整合到目标程序中的库文件形式。使用静态库后,库的代码会成为可执行文件的一部分,运行时不需要依赖外部库。...方法1: 首先我们需要将两个.c文件编译为.o文件: 形成两个同名的.o文件 首先我们来了解一个命令:ar ar命令是 Linux 下的一个归档工具,通常用于创建、修改和提取静态库(archive...stdc/lib @tar -czf stdc.tgz stdc @echo "output stdc ... done" gcc -fPIC -c $< 这个选项中的-fPIC是形成与位置无关码 如何使用动态库...动态库和静态库的优先级 在 Linux 系统中,使用 gcc 或类似工具进行编译和链接时,动态库(shared library, .so) 和 静态库(static library, .a) 的优先级由动态链接器和链接器的搜索顺序决定...静态库备选: 如果动态库不存在,或者编译时显式指定了使用静态库的选项,链接器会尝试查找 .a 文件。 总结 本文详细介绍了静态库与动态库的概念、创建方法及其使用方式。

    6010

    【Linux】动静态库

    @TOC 动静态库 1....设计库 库分为 静态库(.a)和动态库(.so) 库的命名 以c++的库为例 输入 ls /lib64/libstdc++* 以lib开头要去除 库的真实名字为 stdc++ ---- 一般云服务器...,默认只会存在动态库,不需要动态库,静态库需要单独安装 myadd.h 实现一个加法的声明 #pragma once int myadd(int d1,int d2); ---- myadd.c...lib中 还是会报错 ,因为lib库并不属于c/c++的标准库 还需要告诉库的名字是什么 ---- 将独立的将库引入otherperson中 ,可以正常运行 第三方库的使用 第三方库的使用 1.需要的是指定的头文件和库文件...+标准的库,所以被认为是第三方库 ---- 告诉它需要链接mymath库,就可以正常运行了,而不需要告诉头文件 将下载下来的库和头文件,拷贝到系统默认路径下,这个行为就叫做在Linux下安装库 对于任何软件而言

    2.4K30

    【Linux】————动静态库

    由于windows和linux的本质不同,因此二者库的二进制是不兼容的。 本文仅限于介绍linux下的库。 二.库的种类 1. 在windows中 .dll 动态库 .lib 静态库 2....四.库文件是如何产生的在linux下 静态库的后缀是.a,它的产生分两步: Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表 Step 2.ar命令将很多.o转换成.a,成文静态库...六.如何知道一个可执行程序依赖哪些库 ldd命令可以查看一个可执行程序依赖的共享库 七:重点 1.静态库: 1.1、怎么做静态库: 在Linux环境下,通常使用GCC(GNU Compiler Collection...创建静态库:使用 ar工具将对象文件打包成静态库。...方式一:直接使用打包的文件 为了更好的使用静态库,我们把前面打包的文件拷贝到另外的目录进行操作。

    7110

    【Linux】动静态库

    hello,大家好,今天我们继续学习Linux中的动静态库,我们将从不同的角度来学习如何使用,并如何制作一个可供他人使用的动静态库文件,并试着探究一下动态库加载问题。那我们就开始学习吧!!...那么,Linux下的库在什么位置呢? 如上便是我们使用库所要吧包含的所有的头文件。 接下来,我们回答几个问题: 问:1....准备工作完成,接下来,正式开始: 3.1静态库和静态链接 为了方便一些,我们创建一个makefile 我们直接把这个归档形成的文件给使用者,使用者就可以使用了吗?不好意思,不可以。...由于默认使用的是动态链接,这就意味着:当依赖的库中有一个库是动态链接,整体就是动态链接的。静态链接的库以静态的方式吧代码拷贝过来,但最终整体是动态链接。...那我们使用静态库中的函数,在程序加载到内存时,这些函数的实现方法拷贝到哪里呢?

    9110

    linux动态库和静态库

    http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520101023104745738/ Linux下静态库_库的基本概念;如何生成静态库动态库...ln -s libhello.so.1.0 libhello.so.1        ln -s libhello.so.1 libhello.so 1.3、静态库,动态库文件在linux下是如何生成的...libhello.so.1.0 hello.o 1.4、库文件是如何命名的,有没有什么规范: 在 linux 下,库文件一般放在/usr/lib和/lib下, 静态库的名字一般为libxxxx.a...可以使用 ar q libname.a xxx1.o xxx2.o xxx3.o ... xxxn.o 生成静态库 1.9、如何查看动态库和静态库是32位,还是64位下的库: 如果是动态库,可以使用...一、静态库解析符号引用: 链接器ld是如何使用静态库来解析引用的。在符号解析阶段,链接器从左至右,依次扫描可重定位目标文件(*.o)和静态库(*.a)。

    12.4K20

    【Linux】静态库和动态库

    制作静态库 (1)朴素方法 — 不打包 下面我们实现两个简单的方法,加法和减法的计算方法,使用头文件和源文件分开的形式呈现出来,例如: 那么这一堆头文件和源文件该如何形成一个静态库给别人使用呢?...接下来我们在该目录下创建一个测试以上方法的主函数 TestMain.c: 假设现在我们需要将上面的所有文件形成一个可执行程序测试,该如何编译呢?使用 gcc!...使用静态库 (1)朴素方法 — 直接使用 上面我们可以形成静态库了,那么我们该如何使用别人的静态库呢?...使用 Makefile 生成多个可执行程序 上面我们都是使用 Makefile 生成一个动态库和一个静态库,接下来我们要使用 Makefile 一次性生成动态库和静态库,下面直接参考 Makefile...首先我们要知道,在 Linux 下,形成的可执行程序是 ELF 格式的可执行程序,它其中包含有一张类似于符号表的东西,里面包含各种函数依赖的库以及地址,符号表就是动态链接这些动态库的。

    74610

    【Linux】静态库和动态库

    Linux为什么不允许普通用户给目录建立硬链接呢? 系统层面上有.和…硬链接指向目录。...一、动态库和静态库 具体的动态库和静态库的相关内容点击跳转 Linux的库一般分为动态库和静态库: 静态库(.a):库文件以.a为后缀,程序在编译链接的时候把库的代码链接到可执行文件中。...程序运行的时候将不再需要静态库 动态库(.so):库文件以.so为后缀,程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。...链接的本质:无非就是我们调用库函数的时候和标准库是如何关联的问题 库的名称:去掉前缀lib去掉后缀.so/.a剩下的就是库名称,比如libc.so就是C库 gcc 在编译时默认使用动态链接,而生成静态链接...那样太过于麻烦,为了让用户更好的使用库,我们就有把所有的.o文件打成一个包,给对方提供一个库文件即可!把多个.o合并成一个文件,这个文件就是库,把包方式的不同就分为了动态库和静态库*。

    32130

    怎样在 Linux 中使用动态和静态库

    Linux 从某种意义上来说就是一堆相互依赖的静态和动态库。对于 Linux 系统新手来说,库的整个处理过程简直是个迷。...为了让你熟悉这个话题,我准备了一个小巧的 应用例子 来展示在普通的 Linux 发行版(在其他操作系统上未验证)上是经常是如何处理库的。...当你的应用链接了一个静态库,这个库的代码就变成了可执行文件的一部分。...这个动作只在链接过程中执行一次,这些静态库通常以 .a 扩展符结尾。 静态库是多个 目标(object)文件的 归档(archive)(ar)。这些目标文件通常是 ELF 格式的。...为了检查一个应用在启动时需要哪些库,你可以使用 ldd 命令,它会打印出给定文件所需的动态库: $ ldd my_app linux-vdso.so.1 (0x00007ffd1299c000

    2K21

    【Linux】从零开始认识动静态库 - 静态库

    就是在我们的库中! 2 动静态库概述 学习了这么多的知识,我们有没有使用过库呢?...直白一点来讲,假如你想玩游戏,静态库就是买一台电脑放在宿舍,动态库就是去网吧与其他人共享。 Linux系统下基本都是使用动态库: 接下来我们来详细说说静态库和动态库。...实际工作中,80%的情况都是使用动态库!!! 3 建立静态库 我们来谈谈如何建立静态库。 3.1 背景知识 首先我们创建几个头文件和对应的函数实现: 我们现在有两套方法。...建立一个静态库发给舍友!!! 这个静态库如何使用呢?...-- 0/0 1240 Sep 15 16:53 2017 sub.o 3.3 使用静态库 那打包好了静态库,应该如何使用静态库呢?

    15110

    linux 动态库 静态库_静态库里面包含动态库

    动态库与静态库 文件系统补完 文件的三个时间acm 动态库与静态库 动态链接与静态链接 静态库与动态库 动静态库的对比 生成静态库 打包静态库 使用静态库 生成动态库 打包动态库 使用动态库 文件系统补完...动态库与静态库 我们在实际开发中,经常要使用别人已经实现好的功能,这是为了开发效率和鲁棒性(健壮性);因为那些功能都是顶尖的工程师已经写好的,并且已经践行多年的代码。 那么如何使用他人开发的功能呢?...可以使用:1.库,包括静态库与动态库。2.开源代码。3.基本的网络功能调用,比如各种网络接口、语音识别等等。 这其中,我们将详细介绍静态库和动态库。...生成静态库 我们为什么会制作库呢?一般是想让别人能够使用我们实现的功能,但又不暴露自己的源代码才会打包库。那么接下来我们来学习如何打包静态库。...生成动态库 学习完生成和使用静态库后,下面我们来生成一下动态库。

    7.4K20

    Linux共享库、静态库、动态库详解

    介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?...静态函数库对开发者来说还是很有用的,例如你想把自己提供的函数给别人使用,但是又想对函数的源代码进行保密,你就可以给别人提供一个静态函数库文件。...在用ar命令创建静态库函数的时候,还有其他一些可以选择的参数,可以参加ar的使用帮助。这里不再赘述。 一旦你创建了一个静态函数库,你可以使用它了。...这些函数库如何使用 在基于GNU glibc的系统里,包括所有的linux系统,启动一个ELF格式的二进制可执行文件会自动启动和运行一个program loader。...如何使用库 在基于GNU glibc的系统(包括所有Linux系统)上,启动ELF二进制可执行文件会自动导致程序加载器被加载并运行。

    8.9K11

    Linux:理解动静态库

    相当于给别人的一份方法使用说明书      所以为了学习如何创建静态库和动态库以及理解静态链接和动态链接的本质。...我们得从以下两个角度来理解: (1)站在库的制作者角度——>尝试自己写一个简单的库 (2)站在库的使用者角度——>学会如何使用第三方库 二、静态链接 静态库 ——libXXX.a   2.1 静态库的原理和命令...静态库制作和公开  这样就可以完成静态库的制作,然后可以公开出去,变成一个lib文件夹给用户 2.3 库使用及路径问题       可是我们在头文件将路径都表示出来,显然不符合我们的使用习惯,如果我们去掉路径只保留...——>所以第三方库使用的时候无论如何必须用-l  2.4 errno的理解 2.5 理解库的安装  其实我们将库拷贝到系统路径的过程就是——库的安装!!   ...5、以前我们写的代码的库是动态库,只不过无论是在windows还是linux,写C、C++相关头文件和库,编译器和系统都可以找到,所以你才能实现无障碍编程,所以你想让第三方库也实现无障碍编程,关键在于如何如何让编译器和系统找到这个库

    12011

    Linux静态库与动态库加载

    在Linux当中,以.so为后缀的是动态库,以.a为后缀的是静态库。 在Windows当中,以.dll为后缀的是动态库,以.lib为后缀的是静态库。 认识了动态库,那静态库,又是什么呢?...,不再需要库,但动态库不行,在日常我们都会使用动态库,很少使用静态库。...*.o:  使用ar命令将目标文件打包成静态库,下面我们使用ar命令的-r选项和-c选项进行打包。...注意上面我打包了两个库,虽然看后缀一个静态库,一个动态库,但是其实上述的库都是静态库,linux不是单单通过后缀来判断一个库的类型,下面就来看看如何真正打包一个动态库吧。...打包:使用-shared选项将所有目标文件打包为动态库 与生成静态库不同的是,生成动态库时我们不必使用ar命令,我们只需使用gcc的-shared选项即可。

    18510

    【Linux】动静态库以及动静态链接

    环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【 Linux 】欢迎支持订阅 ---- 链接扩展 我们在使用Linux的时候,不禁会有这么一个疑问:为什么我们能够在...动静态库与动静态链接 在Linux下共分为两种库,一种是动态库,另一种为静态库。其实我们可以通过后缀就可以区分该库是否为动态库。...静态库与静态链接 感性理解 感性理解就是将网吧里我们最喜欢的那台电脑给买回来,放在宿舍里供自己玩耍。...理性理解 静态库专门让编译器对用户的程序进行静态链接,在链接时,将静态库中所需要的完整代码给拷贝到自己的可执行程序内部中。...就好比将网吧里想要的那台电脑给买回宿舍,会很大的占用我们的私人空间(Linux中默认的方式为动态链接,当然我们可以用gcc/g++编译时使用-static的命令,来实现以静态链接的方式运行。)

    4.9K50

    Linux之动态库和静态库

    前言 一、动态库和静态库概念 在之前的文章中,介绍过动静态库的概念,因此这次我们只是简单回顾一下。 Linux中的库分为动态库和静态库。...动态库(.so):库文件以.so为后缀,程序在运行时才去链接动态库的代码(运行时跳转到动态库中,在动态库中执行库函数)。多个程序共享库的代码。 链接的本质:我们调用库函数时是如何与标准库联系的。...三、制作静态库 首先,如果写一个库是否需要写main函数? 答案是不需要,因为库是提供给别人使用的,用户自己写的main函数会与库函数起冲突。...动态库相对于静态库更节省内存,静态库由多个程序使用相同的库函数,加载到内存中就会导致内存中有多份重复的库函数代码,而动态库则是多个程序共用一份动态库,不会导致出现重复的库函数代码,就节省了内存空间。...总结 以上就是今天要讲的内容,本文介绍了Linux中的动静态库的相关概念。

    59420

    初识Linux · 动静态库(incomplete)

    可是我们在文件权限部分,我们已经见识了最基本的库,知道了Linux的动态库的后缀是.so 静态库是.a,Windows系统的动态库是.dll,静态库是.lib。...当然是使用过的,在使用C语言C++的时候,我们使用的头文件所在的库,比如std库,我们肯定是使用过的。那么库的作用是什么呢?...: 然后使用命令ar生成静态库: 其中replace 是r,c是create,如果没有就创建。...这是对于静态库的创建,libmyc.a就是我们创建的静态库,但是实际上,myc才是这个静态库的名字。...可是对于库的使用来说,比如C语言提供多个库,我们都是#include 的,当使用的时候,编译器会去安装好的库里面查找,所以这里面肯定存在路径问题。 使用L l选项可以解决该问题。

    7210
    领券