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

linux c 静态库创建

Linux C 静态库创建基础概念及步骤

基础概念

静态库(Static Library)是一种在编译时被链接到程序中的库文件。它包含了编译好的目标代码,可以在程序运行时直接使用,而不需要在运行时动态加载。静态库通常以 .a 文件形式存在。

优势

  1. 性能:由于代码在编译时已经被链接,运行时不需要额外的加载时间。
  2. 独立性:生成的程序不依赖于外部库文件,便于分发和部署。
  3. 安全性:静态链接减少了对外部库的依赖,降低了潜在的安全风险。

类型

  • Archive Files (.a):这是最常见的静态库格式,由多个目标文件(.o)组成。

应用场景

  • 嵌入式系统:由于资源有限,静态链接可以减少运行时的开销。
  • 安全性要求高的应用:避免动态链接带来的潜在安全风险。
  • 性能敏感的应用:减少运行时的加载时间,提高执行效率。

创建静态库的步骤

1. 编写源代码

假设我们有两个源文件 func1.cfunc2.c,以及对应的头文件 func1.hfunc2.h

代码语言:txt
复制
// func1.c
#include "func1.h"
void func1() {
    printf("This is function 1.\n");
}

// func2.c
#include "func2.h"
void func2() {
    printf("This is function 2.\n");
}

2. 编译源文件为对象文件

使用 gcc 编译器将源文件编译成目标文件(.o)。

代码语言:txt
复制
gcc -c func1.c -o func1.o
gcc -c func2.c -o func2.o

3. 创建静态库

使用 ar 工具将目标文件打包成静态库。

代码语言:txt
复制
ar rcs libmylib.a func1.o func2.o

这里的 r 表示替换或添加文件,c 表示创建新的归档文件,s 表示创建或更新索引。

4. 使用静态库

编写一个主程序 main.c 来使用这个静态库。

代码语言:txt
复制
// main.c
#include "func1.h"
#include "func2.h"

int main() {
    func1();
    func2();
    return 0;
}

编译主程序时,指定静态库的路径和名称。

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

这里的 -L. 表示在当前目录下查找库文件,-lmylib 表示链接名为 libmylib.a 的库。

常见问题及解决方法

问题1:找不到库文件

原因:编译器无法找到指定的库文件。 解决方法

  • 确保库文件存在于指定的路径中。
  • 使用 -L 选项指定库文件的搜索路径。

问题2:链接错误

原因:可能是库文件中缺少所需的符号(函数或变量)。 解决方法

  • 检查库文件是否正确包含了所需的目标文件。
  • 确保头文件和源文件中的函数声明和定义一致。

示例代码

以下是一个完整的示例,展示了如何创建和使用静态库:

代码语言:txt
复制
# 编写源代码
cat > func1.c <<EOF
#include "func1.h"
void func1() {
    printf("This is function 1.\n");
}
EOF

cat > func2.c <<EOF
#include "func2.h"
void func2() {
    printf("This is function 2.\n");
}
EOF

cat > func1.h <<EOF
void func1();
EOF

cat > func2.h <<EOF
void func2();
EOF

cat > main.c <<EOF
#include "func1.h"
#include "func2.h"

int main() {
    func1();
    func2();
    return 0;
}
EOF

# 编译源文件为对象文件
gcc -c func1.c -o func1.o
gcc -c func2.c -o func2.o

# 创建静态库
ar rcs libmylib.a func1.o func2.o

# 使用静态库编译主程序
gcc main.c -L. -lmylib -o myprogram

# 运行程序
./myprogram

通过以上步骤,你可以成功创建并使用一个简单的静态库。

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

相关·内容

Linux下静态库、动态库的创建与调用

一、前言 在项目开发时,经常会用到第三方库,也会自己创建动态库给别人或者给自己其他的工程项目使用。 库的类型分为动态库、静态库。 在Linux下动态库的后缀为.so,静态库的后缀为.lib。...动态库称为共享库. 程序在编译的时需要、运行的时候也需。 静态库在编译的时候抽取需要使用的函数进行编译、运行的时候不需要库。 静态编译的程序比动态库链接占用空间更加大。...二、动态库的创建与使用案例 2.1 创建动态库 创建动态库的语法格式: gcc -fPIC -shared -o 库文件名称>.so 源文件名称.c 库文件名称>如何命名?.../a.out 三、静态库创建与使用 3.1 创建静态库 注意: 动态库如果静态库名字重名的时候,编译器优先使用动态库....静态库的命名规则: libxxx.a 创建静态库的流程: 先将.c源文件编译成.o文件 gcc xxx.c xxx.c xxx.c ...

5.5K30
  • 创建属于自己的静态库,并合并静态库

    静态库的使用:     在项目的开发中经常会用到静态库.如果我们不希望别人看到我们代码的内部实现,我们就可以给别人一个静态库.     ...在使用静态库之前让我们先来创建静态库:     1.首先创建一个Project,选择Framework&Library中的Static Library ? ?     ...静态库创建之后,Xcode会为我们生成.h和.m文件,如下图.并且TARGETS处的小图标也会较之前有所变化. ?     ...2.实现静态库中的功能     静态库创建好之后我们就可以实现静态库的功能了,(在.h和.m文件中),实现的过程和我们平时写代码是一样的(.h声明, .m实现).     .h中的代码:     ...生成了.a文件,表明合并成功.     5.使用静态库     接下来就让我们来用一下我们自己创建的静态库     新建一个工程,并将静态库和.h文件导入工程. ?

    1.2K30

    【Linux】动静态库

    静态库的手动创建过程 我们写两个c文件,并且两个c文件都带有头文件: my_stdio.c #include "my_stdio.h" #include #include<...方法1: 首先我们需要将两个.c文件编译为.o文件: 形成两个同名的.o文件 首先我们来了解一个命令:ar ar命令是 Linux 下的一个归档工具,通常用于创建、修改和提取静态库(archive...我们就用这个命令来创建静态库: 我们需要用到两个选项,一个是r,一个是c,如果没有这个文件的静态库,则创建,如果有则替换。...动态库和静态库的优先级 在 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...静态库打包 只有一个.o的压缩包 tar - c :创建一个新的归档文件即压缩包 tar- r : 若.c文件修改了,则对一个或者多个.o文件做替换 ---- 当前目录下包含 mylib otherperson...+标准的库,所以被认为是第三方库 ---- 告诉它需要链接mymath库,就可以正常运行了,而不需要告诉头文件 将下载下来的库和头文件,拷贝到系统默认路径下,这个行为就叫做在Linux下安装库 对于任何软件而言

    2.4K30

    【Linux】————动静态库

    由于windows和linux的本质不同,因此二者库的二进制是不兼容的。 本文仅限于介绍linux下的库。 二.库的种类 1. 在windows中 .dll 动态库 .lib 静态库 2....在linux中 .so 动态库 .a 静态库 二者的不同点在于代码被载入的时刻不同。 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。...四.库文件是如何产生的在linux下 静态库的后缀是.a,它的产生分两步: Step 1.由源文件编译生成一堆.o,每个.o里都包含这个编译单元的符号表 Step 2.ar命令将很多.o转换成.a,成文静态库...)编译器来编译源代码,并使用ar(archiver)工具来创建静态库 编写源代码:首先,你需要有一些源代码文件,比如 x.c ,y.c ,z.c 编译源代码为对象文件:使用GCC编译器将源代码编译为目标文件...创建静态库:使用 ar工具将对象文件打包成静态库。

    7110

    【Linux】动静态库

    hello,大家好,今天我们继续学习Linux中的动静态库,我们将从不同的角度来学习如何使用,并如何制作一个可供他人使用的动静态库文件,并试着探究一下动态库加载问题。那我们就开始学习吧!!...另外对于C/C++来说其库的名称也是有规范要求的,例如在Linux下:一般要求是lib + 库的真实名称 +(版本号)+ .so /.a + (版本号),版本号是可以省略不写的。...准备工作完成,接下来,正式开始: 3.1静态库和静态链接 为了方便一些,我们创建一个makefile 我们直接把这个归档形成的文件给使用者,使用者就可以使用了吗?不好意思,不可以。...我们为什么可以在Linux下敲C语言代码呢?这是因为系统中有C语言所需的头文件和库文件。 交付库:将形成的归档文件和匹配的头文件都传给别人。...方案二 对配置文件进行修改 该文件夹下保存着相关的搜索信息,我们可以创建任意名称的文件,然后将动态库路径写入文件中即可。

    9110

    Xcode 创建.a和framework静态库

    最近因为项目中的聊天SDK,需要封装成静态库,所以实践了一下创建静态库的步骤,做下记录。 库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种。...创建.a静态库 第一步,新建工程。一般使用工程名就使用库的名称,比如我这里用FMDB来创建静态库,我的工程名就取名为FMDB,创建的.a静态库就是libFMDB.a。 ?...使用静态库模板新建工程.png ? 创建的工程.png 第二步,删除系统默认创建的【FMDB.h】和【FMDB.m】文件,导入需要打包的源文件。 ?...所以如果你很在意你的app大小,并且也不是很需要打包成静态库的话,还是用原始类吧。 framework静态库中是可以包含图片资源的;而.a静态库中不能包含图片资源,只能另外创建一个目录存放。...例如: 我们创建了一个叫ABC.framework的静态库。

    3.3K31

    【Linux】静态库和动态库

    Linux为什么不允许普通用户给目录建立硬链接呢? 系统层面上有.和…硬链接指向目录。...一、动态库和静态库 具体的动态库和静态库的相关内容点击跳转 Linux的库一般分为动态库和静态库: 静态库(.a):库文件以.a为后缀,程序在编译链接的时候把库的代码链接到可执行文件中。...---- 四、制作动态库 首先我们需要把库文件全部编译成.o文件,这里与静态库不同,需要带上选项 -fPIC,形成与位置无关码: gcc -c -fPIC my_add.c 什么是与位置的无关码的目标二进制文件.../etc/ld.so.conf.d/,ldconfig更新 4.创建软链接 ---- 五、动静态库的加载 静态库不需要加载,静态库把代码拷贝到可执行程序里,直接决定了当加载的时候在内存里代码和数据可能存在多份...而静态库可能有多个程序用了C库,加载到内存时,内存里可能会存在100份重复的代码。而动态链接不会出现重复的代码,减少内存。

    32230

    【仓颉】创建静态库及使用

    ——摘自仓颉首页[1] 本文将逐步实现仓颉静态库的创建和使用,使用的当前版本为0.51.4。...前置条件 关于Win11 + VSCode的开发环境,请参考这篇文章[2] 创建静态库项目 在VSCode中使用快捷键ctrl + shift + p 在上方的输入框中搜索Create Cangjie...库的名称statictest是创建工程的时候设定的。另外可以看到项目根目录中的cjpm.toml中name字段。这个字段的值设置了三方库的名称。...这里为了区分名称,我在之前写库的时候,包名和库名特地写成了不一样的。还记得吗?statictest是库工程中cjpm.toml的name字段。...statictestpack是库项目中,demo.cj开头声明的package。 这样引入刚才的静态库之后,就可以在下方的代码中调用cjadd()方法了。

    25010

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

    直白一点来讲,假如你想玩游戏,静态库就是买一台电脑放在宿舍,动态库就是去网吧与其他人共享。 Linux系统下基本都是使用动态库: 接下来我们来详细说说静态库和动态库。...实际工作中,80%的情况都是使用动态库!!! 3 建立静态库 我们来谈谈如何建立静态库。 3.1 背景知识 首先我们创建几个头文件和对应的函数实现: 我们现在有两套方法。...通过命令 ar -rc libmyc.a *.o 就可以创建一个静态库 于是你就发给了舍友: 然后继续编译链接就可以了: 这样就好了!!!...来看一下具体命令: 生成静态库[root@localhost linux]# ar -rc libmymath.a add.o sub.o ar是gnu归档工具,rc表示(replace and create...因为之前我们使用的库都是C/C++的库,我们的编译器是认识他们的。而我们写的是第三方库,编译器就不认识。

    15110

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

    动态库与静态库 文件系统补完 文件的三个时间acm 动态库与静态库 动态链接与静态链接 静态库与动态库 动静态库的对比 生成静态库 打包静态库 使用静态库 生成动态库 打包动态库 使用动态库 文件系统补完...静态库与动态库 一般的命名方式为lib+库的名字+.a比如C语言提供的标准静态库名字就是libc.a。 静态库是指程序在编译链接的时候把库的代码链接到可执行文件中。...打包静态库 由于生成静态库需要先生成目标文件(.o)再进行打包,故先编写相应的源文件再将其编译成目标文件: [lyl@VM-4-3-centos 2022-3-14]$ gcc -c add.c -o...add.o #生成目标文件 [lyl@VM-4-3-centos 2022-3-14]$ gcc -c sub.c -o sub.o #生成目标文件 此时的add.o和sub.o文件是已经编译好但还没有链接的两个文件...gcc寻找的默认路径: /usr/include 因此,正确链接的指令为: gcc -o main main.c -I ./lib -L .

    7.4K20

    创建并使用静态库(ar 命令)

    创建并使用静态库(ar 命令) archive命令的功能是:创建或改动归档文件或者从归档文件里析取信息。...能够简单的理解为一个打包工具,将成员文件依照一定的规则构建到.a文件里,通常这样的类型的归档文件用来将经常使用的例程组织为一个静态库,方便应用程序的链接。...重要參数: d – 从archive中删除模块,若指定v选项的话还会在删除的过程中信息打印; r – 以替换的方式添加模块; c – 强制创建一个库。无论已存在与否。...s – 为库中的可重定位目标文件创建符号索引或者更新, 对一个库运行ar -s等价于对其运行ranlib命令。...用ar构建一个静态库。demo例如以下: 注:gcc -L 表示指定搜索库的路径。

    1K10

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

    介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?...1、静态函数库,是在程序执行前就加入到目标程序中去了 ; 2、动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)...创建一个静态函数库文件,或者往一个已经存在地静态函数库文件添加新的目标代码,可以用下面的命令: ar rcs my_library.a file1.o file2.o 这个例子中是把目标代码...在用ar命令创建静态库函数的时候,还有其他一些可以选择的参数,可以参加ar的使用帮助。这里不再赘述。 一旦你创建了一个静态函数库,你可以使用它了。...Linux系统下,DL函数库与其他函数库在格式上没有特殊的区别,我们前面提到过,它们创建的时候是标准的object格式。

    8.9K11

    Linux:理解动静态库

    相当于给别人的一份方法使用说明书      所以为了学习如何创建静态库和动态库以及理解静态链接和动态链接的本质。...1、ar是一个生成静态库的命令,第一个是打算生成的.a文件 后面跟着的是所有的.o文件  2、选项-rc(replace and create)的意思是如果目标静态库文件存在就替换,不存在就创建 2.2...也可以搞软连接 三、动态链接 3.1 动态库的原理和命令 动态库的原理和静态库一样,因为最后都要链接,所以都是先把-c变成-o,然后再用命令打包起来 和静态库的区别: (1)gcc编译多了一个选项 -fPIC...5、以前我们写的代码的库是动态库,只不过无论是在windows还是linux,写C、C++相关头文件和库,编译器和系统都可以找到,所以你才能实现无障碍编程,所以你想让第三方库也实现无障碍编程,关键在于如何如何让编译器和系统找到这个库...一开动态库文件内容不一定会被加载进来(因为可能很大),而是先创建相关的结构体和地址空间。

    12211
    领券