0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用C语言构建一个静态库呢

冬至子 来源:计算机科学实验室 作者:好坏生长 2023-01-18 11:20 次阅读

在用到linux编程的时候,Makefile可以很好的帮助管理C语言工程,如何构建一个静态库,用一个很小的案例来说明。

首先准备需要的文件,以及文件中的内容,如下所示

$ cat test1.c 
#include 


int main()
{
  printf("hello world\\n");


  return 0;
}

这个.c文件非常简单,就是输出一个hello world。用gcc编译,就能输出。

`

: ~/Documents/clan/test1$ gcc test1.c

:~ /Documents/clan/test1$ tree

.

├── a.out

└── test1.c

0 directories, 3 files

:~/Documents/clan/test1$ ./a.out

hello world

2.jpg

现在换种方式实现,采用Makefile的形式,编辑Makefile的脚本

:~/Documents/clan/test1$ rm a.out 
:~/Documents/clan/test1$ cat Makefile 
test1 : test1.o
  gcc -o test1 test1.o


test1.o : test1.c
  gcc -c -o test1.o test1.c


clean :
  rm -f test1 test1.o

编译Makefile文件,同样可以实现这个效果

:~/Documents/clan/test1$ tree
.
├── Makefile
└── test1.c

0 directories, 2 files
:/Documents/clan/test1$ make
gcc -c -o test1.o test1.c
gcc -o test1 test1.o
:
/Documents/clan/test1$ tree
.
├── Makefile
├── test1
├── test1.c
└── test1.o

0 directories, 4 files
:~/Documents/clan/test1$ ./test1
hello world

2.jpg

现在将产物删掉,方便后面的实验

: ~/Documents/clan/test1$ make clean

rm -f test1 test1.o

:~ /Documents/clan/test1$ tree

.

├── Makefile

└── test1.c

0 directories, 2 files

2.jpg

现在回到gcc 编译的过程中,先编译得到.o文件,然后编译得到静态库文件,最后通过编译库文件,同样可以生成可执行文件

: ~/Documents/clan/test1$ gcc -c -o test1.o test1.c

:~ /Documents/clan/test1$ tree

.

├── Makefile

├── test1.c

└── test1.o

0 directories, 3 files

: ~/Documents/clan/test1$ ar -cr libtest1.a test1.o

:~ /Documents/clan/test1$ tree

.

├── libtest1.a

├── Makefile

├── test1.c

└── test1.o

0 directories, 4 files

: ~/Documents/clan/test1$ gcc libtest1.a

:~ /Documents/clan/test1$ tree

.

├── a.out

├── libtest1.a

├── Makefile

├── test1.c

└── test1.o

0 directories, 5 files

:~/Documents/clan/test1$ ./a.out

hello world

2.jpg

删除上述生成的文件

: ~/Documents/clan/test1$ rm a.out

:~ /Documents/clan/test1$ rm libtest1.a

: ~/Documents/clan/test1$ rm test1.o

:~ /Documents/clan/test1$ tree

.

├── Makefile

└── test1.c

0 directories, 2 files

重新编辑Makefile文件

test1 : libtest1.a

gcc -o test1 libtest1.a

libtest1.a : test1.o

ar -cr libtest1.a test1.o

test1.o : test1.c

gcc -c -o test1.o test1.c

clean :

rm -f test1 test1.o libtest1.a

2.jpg

重新编译Makefile文件,然后执行,同样可以实现,这就是静态库的实现方式

: ~/Documents/clan/test1$ make

gcc -c -o test1.o test1.c

ar -cr libtest1.a test1.o

gcc -o test1 libtest1.a

:~ /Documents/clan/test1$ tree

.

├── libtest1.a

├── Makefile

├── test1

├── test1.c

└── test1.o

0 directories, 5 files

:~/Documents/clan/test1$ ./test1

hello world

上述方式,实现了一个非常简单的案例,这是在同一目录层级下实现的,如果涉及到多个目录层级呢?

├── func

│ ├── func.c

│ └── func.h

├── Makefile

└── test1.c

其中func.c文件的代码如下

#include "func.h"

int add(int a, int b){return a+b;}

func.h文件的代码

int add(int a, int b);

test.c文件的代码

#include

#include "func/func.h"

int main()

{

printf("hello world\\n");

printf("%d\\n",add(10,20));

return 0;

}

用gcc命令编译

2.jpg

然后修改Makefile文件

:~/Documents/clan/test1$ cat Makefile

test1 : test1.o func/func.o

gcc -o test1 test1.o func/func.o

test1.o : test1.c

gcc -c -o test1.o test1.c

func/func.o : func/func.c func/func.h

gcc -c -o func/func.o func/func.c

clean :

rm -f test1 test1.o func/func.o

2.jpg

编译所有文件,运行可执行文件,即可输出结果

:~/Documents/clan/test1$ tree

.

├── func

│ ├── func.c

│ └── func.h

├── Makefile

└── test1.c

1 directory, 4 files

: ~/Documents/clan/test1$ make

gcc -c -o test1.o test1.c

gcc -c -o func/func.o func/func.c

gcc -o test1 test1.o func/func.o

:~ /Documents/clan/test1$ tree

.

├── func

│ ├── func.c

│ ├── func.h

│ └── func.o

├── Makefile

├── test1

├── test1.c

└── test1.o

1 directory, 7 files

:~/Documents/clan/test1$ ./test1

hello world

30

2.jpg

要生成Makefile的静态库,只需要在这个基础上进行修改即可

test1 : libtest1.a func/libfunc.a

gcc -o test1 libtest1.a func/libfunc.a

libtest1.a : test1.o

ar -cr libtest1.a test1.o

func/libfunc.a : func/func.o

ar -cr func/libfunc.a func/func.o

test1.o : test1.c

gcc -c -o test1.o test1.c

func/func.o : func/func.c func/func.h

gcc -c -o func/func.o func/func.c

clean :

rm -f test1 test1.o libtest1.a func/libfunc.a func/func.o

2.jpg

这是一个非常简单的模板案例,静态库的编译过程比较简单,动态库相对复杂。

审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136834
  • gcc编译器
    +关注

    关注

    0

    文章

    78

    浏览量

    3385
  • Linux编程
    +关注

    关注

    0

    文章

    5

    浏览量

    618
收藏 人收藏

    评论

    相关推荐

    C语言标准的基本使用

    写出看起来专业的C代码,除了规范的变量/函数命名,还需要熟练使用C语言的标准。当为了数组拷贝自己编写
    发表于 09-14 14:04 702次阅读

    介绍C语言编写的硬件外设访问

    今天要介绍的开源软件叫 c-periphery,C 语言编写的硬件外设访问
    的头像 发表于 10-26 10:36 1250次阅读
    介绍<b class='flag-5'>一</b><b class='flag-5'>个</b>用<b class='flag-5'>C</b><b class='flag-5'>语言</b>编写的硬件外设访问<b class='flag-5'>库</b>

    自己如何利用C语言封装TRACE函数?

    自己如何利用C语言封装TRACE函数?
    发表于 10-18 09:03

    如何利用C语言去编写单片机程序

    C语言和汇编语言有哪些差异?如何利用C语言去编写单片机程序
    发表于 11-02 09:59

    静态的优点及其静态的使用解析

    静态优点:运行快,发布程序无需提供静态,因为已经在app中,移植方便缺点:更新慢 繁琐1、静态
    发表于 02-17 07:45

    如何利用C语言去调用rust静态

    持续。rust整个结构还不是特别清晰,特别是和wrapper相关的同C项目,包含多个rust的静态
    发表于 06-21 10:27

    100经典C语言程序

    c语言编写,c语言的100经典程序,单片机的应用,开发利用
    发表于 12-17 11:46 11次下载

    数码管(静态显示)【C语言版】

    数码管(静态显示)【C语言版】数码管(静态显示)【C语言版】数码管(
    发表于 12-29 15:27 0次下载

    数码管(静态显示)【C语言+汇编版】

    数码管(静态显示)【C语言+汇编版】,多种集合,符合C语言和汇编爱好者学习。
    发表于 12-31 10:16 0次下载

    学习C语言的目标和方法有哪些及C语言的关键字说明

     、学习C语言的目标主要是:1. 熟练掌握C语言的关键字,语法规则,程序控制等;2. 掌握基本的数据结构,数组、链表、栈和队列等;3. 掌
    发表于 08-02 17:34 1次下载
    学习<b class='flag-5'>C</b><b class='flag-5'>语言</b>的目标和方法有哪些及<b class='flag-5'>C</b><b class='flag-5'>语言</b>的关键字说明

    试图构建便于适配不同平台mcu的通用

    试图构建便于适配不同平台mcu的通用
    发表于 11-26 15:21 10次下载
    试图<b class='flag-5'>构建</b><b class='flag-5'>一</b><b class='flag-5'>个</b>便于适配不同平台mcu的通用<b class='flag-5'>库</b>

    C语言宏定义与预处理、函数和函数

    目录前言C语言预处理二、宏定义三、函数四、函数五、自己制作静态链接(ubuntu 环境下
    发表于 12-07 21:06 2次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>宏定义与预处理、函数和函数<b class='flag-5'>库</b>

    静态和动态的生成以及使用(树莓派)

    静态优点: 运行快,发布程序无需提供静态,因为已经在app中,移植方便缺点:更新慢 繁琐1、
    发表于 12-22 18:44 0次下载
    <b class='flag-5'>静态</b><b class='flag-5'>库</b>和动态<b class='flag-5'>库</b>的生成以及使用(树莓派)

    C语言动态静态

    C语言动态静态
    的头像 发表于 02-06 09:45 1367次阅读

    Linux中的静态和共享

    二进制文件,包含的代码可被程序调用。例如标准C、数学、线程
    的头像 发表于 05-10 09:34 1042次阅读