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

    文章

    7528

    浏览量

    128303
  • gcc编译器
    +关注

    关注

    0

    文章

    77

    浏览量

    3233
  • Linux编程
    +关注

    关注

    0

    文章

    5

    浏览量

    602
收藏 人收藏

    评论

    相关推荐

    【OK210试用体验】构建标准cnewlib

    构建标准cnewlib象棋小子 1048272975C语言开发项目往往需要标准c
    发表于 11-01 01:39

    Linux系统动态静态库函数的使用介绍

    动态连接器使用的)。那么到底什么是从本质上来说是种可执行代码的二进制格式,可以被载入内存中执行。
    发表于 04-02 16:21

    动态静态的区别

    .so区分概念:是包含前缀lib以及后缀.a或者.so的整体名是去掉前缀和后缀剩下的
    发表于 05-26 17:22

    Linux系统动态静态库函数的使用介绍

    动态连接器使用的)。 那么到底什么是从本质上来说是种可执行代码的二进制格式,可以被载入内存中执行。
    发表于 09-29 11:31

    Linux系统动态静态库函数的使用介绍

    main.c中调用了hello.c实现的函数,使用静态的方式编译得到可执行文件main_a
    发表于 07-04 05:33

    利用C语言在Linux下怎么实现Sniffer?

    扫描相比,嗅探的行为更加难以被察觉,操作起来也不是很复杂!对于网络管理人员来说,可以利用嗅探技术对网络活动进行监控,并及时发现各种攻击行为!在这篇文章里,我们主要探讨在Linux下如何利用C
    发表于 03-27 07:04

    关于C语言的基础知识

    新属性,所以需要用汇编先构建C语言的环境。(比如不同类型的变量在内存中位置要设置好)。C
    发表于 08-20 07:03

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

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

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

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

    在STM32中如何利用硬件定时器构建多个软件定时器

    在STM32中如何利用硬件定时器构建多个软件定时器?如何去实现STM32软件定时器的设计
    发表于 11-24 06:12

    如何利用C语言寄存器去实现种流水灯

    什么叫寄存器映射?寄存器到底是什么?如何利用C语言寄存器去实现种流水灯
    发表于 01-18 06:23

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

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

    PHY6212 BLE SDK静态制作步骤简述

    静态文件生成后,应用该如何引用静态的引用包含两方面,
    发表于 03-09 06:52

    静态和动态的使用

    种可执行的二进制文件,是编译好的代码。使用可以提高开发效率。在 Linux 下有静态和动态
    发表于 05-04 14:08

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

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