首页 > 系统相关 >Linux静态库生成指南

Linux静态库生成指南

时间:2023-09-17 16:16:34浏览次数:46  
标签:指南 gcc libmylib 静态 int Linux print my

Linux上的静态库,其实是目标文件的归档文件。
在Linux上创建静态库的步骤如下:

  1. 写源文件,通过 gcc -c xxx.c 生成目标文件。
  2. 用 ar 归档目标文件,生成静态库。
  3. 配合静态库,写一个使用静态库中函数的头文件。
  4. 使用静态库时,在源码中包含对应的头文件,链接时记得链接自己的库。

下面通过实例具体讲解。

写源文件,生成目标文件。

第一个源文件 my_print.c

#include <stdio.h>

void cout(const char * message)
{
    fprintf(stdout, "%s\n", message);
}

源文件2: my_math.c

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

int subtract(int a, int b)
{
    return a - b;
}

使用gcc,为这两个源文件生成目标文件:

gcc -c my_print.c my_math.c

我们就得到了 my_print.o 和 my_math.o。

归档目标文件,得到静态库。

我们使用 ar 将目标文件归档:

ar crv libmylib.a my_print.o my_math.o

我们就得到了libmylib.a,这就是我们需要的静态库。

上述命令中 crv 是 ar的命令选项:

  • c 如果需要生成新的库文件,不要警告
  • r 代替库中现有的文件或者插入新的文件
  • v 输出详细信息

通过 ar t libmylib.a 可以查看 libmylib.a 中包含的目标文件。

可以通过 ar --help 查看更多帮助。

注意:我们要生成的库的文件名必须形如 libxxx.a ,这样我们在链接这个库时,就可以用 -lxxx
反过来讲,当我们告诉编译器 -lxxx时,编译器就会在指定的目录中搜索 libxxx.a 或是 libxxx.so

生成对应的头文件

头文件定义了 libmylib.a 的接口,也就是告诉用户怎么使用 libmylib.a。

新建my_lib.h, 写入内容如下:

#ifndef __MY_LIB_H__
#define __MY_LIB_H__

int add(int a, int b);
int subtract(int a, int b);

void cout(const char *);
#endif

测试我们的静态库

在同样的目录下,建立 test.c:

#include "my_lib.h"

int main(int argc, char *argv[])
{
    int c = add(15, -21);
    cout("I am a func from mylib ...");
    return 0;
}

这个源文件中引用了 libmylib.a 中的 cout 和 add 函数。

编译test.c:

gcc test.c -L. -lmylib

将会生成a.out,通过 ./a.out 可以运行该程序。说明我们的静态库能正常工作。

上面的命令中 -L. 告诉 gcc 搜索链接库时包含当前路径, -lmylib 告诉 gcc 生成可执行程序时要链接 libmylib.a

通过makefile自动化

上面的步骤很繁琐,还是写个简单的makefile吧,内容如下:

.PHONY: build test

build: libmylib.a

libmylib.a: my_math.o my_print.o
	ar crv $@ my_math.o my_print.o

my_math.o: my_math.c
	gcc -c my_math.c

my_print.o: my_print.c
	gcc -c my_print.c

test: a.out

a.out: test.c
	gcc test.c -L. -lmylib

makefile写好后,运行 make build 将会构建 libmylib.a, 运行 make test 将会生成链接 libmylib.a 的程序。

如果你在 windows 上使用 mingw,和Linux下生成静态库的方法是一样的。

  分类: Linux开发 标签: Linux , gcc

标签:指南,gcc,libmylib,静态,int,Linux,print,my
From: https://www.cnblogs.com/outrun/p/17708951.html

相关文章

  • Linux五种IO模型
    Linux五种IO模型转载:http://blog.csdn.net/jay900323/article/details/18141217   Linux五种IO模型性能分析 目录(?)[-]概念理解Linux下的五种IO模型阻塞IO模型非阻塞IO模型 IO复用模型信号驱动IO异步IO模型个IO模型的比较selectpollepoll简介1.概念......
  • 欢迎来到小码哥的博客 博客搬家啦 blog.ma6174.com 西邮Linux小组免试题揭秘
    还记得东京大学情报理工学系的招生海报吗?只要答对了问题,然后你就被录取了。当时可火了,人人和微博疯狂转载。如今西邮Linux小组也搞了个这样题目,只要你能答对,就能免试进入西邮Linux小组!感觉挺好玩,遂挑战一把。题目原文在这里:http://www.xiyoubbs.com/thread-81454-1-1.html第......
  • 私人订制——属于你自己的Linux
    私人订制——属于你自己的Linux一、前言Linux操作系统至1991年10月5日诞生以来,就其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在Linux内核还是开源软件等方面,都为我们后来人提供了一个良好的学习和研究环境。本文主要通过......
  • 发布《Linux工具快速教程》
    发布《Linux工具快速教程》阶段性的完成了这本书开源书籍,发布出来给有需要的朋友,同时也欢迎更多的朋友加入进来,完善这本书;本书Github地址:https://github.com/me115/linuxtools_rst在线阅读缘起Linux下有很多命令行工具供我们使用,每个工具总是提供了大量参数供我们选择;实际工......
  • 查看linux系统常用的命令,Linux查看系统配置常用命令
    一、linuxCPU大小 cat/proc/cpuinfo|grep"modelname"&&cat/proc/cpuinfo|grep"physicalid"  说明:Linux下可以在/proc/cpuinfo中看到每个cpu的详细信息。但是对于双核的cpu,在cpuinfo中会看到两个cpu。常常会让人误以为是两个单核的cpu。其实应该通过PhysicalPr......
  • Linux学习之CentOS(二十四)--Linux软件管理之YUM软件管理
     您可以通过点击右下角的按钮来对文章内容作出评价,也可以通过左下方的关注按钮来关注我的博客的最新动态。如果文章内容对您有帮助,不要忘记点击右下角的推荐按钮来支持一下哦如果您对文章内容有任何疑问,可以通过评论或发邮件的方式联系我:501395377@qq.......
  • Linux教材第九章学习笔记——I/O库函数
    C语言文件操作内容复习 cd..  返回上级目标文件: ./  执行文件:对文件内容进行修改,在vim命令行输入wq保存后返回: gcc编译后输入./a.out可显示出c文件运行结果: 编译预处理: 编译: 汇编: 用字符方式逐个打印hello.c;打印十六进制文件: I/O库函数知识......
  • 像黑客一样使用 Linux 命令行
    阅读目录前言##使用tmux复用控制台窗口##在命令行中快速移动光标##在命令行中快速删除文本##快速查看和搜索历史命令##快速引用和修饰历史命令##录制屏幕并转换为gif动画图片##总结##回到顶部前言##之前在博客园看到一篇介绍IntelliJIDEA配置的文章,它里面用......
  • Linux常用命令大全(非常全!!!)
    阅读目录:系统信息 关机(系统的关机、重启以及登出) 文件和目录文件搜索 挂载一个文件系统 磁盘空间 用户和群组 文件的权限-使用"+"设置权限,使用"-"用于取消 文件的特殊属性-使用"+"设置权限,使用"-"用于取消 打包和压缩文件 RPM包-(Fedora,......
  • Linux安装maven(详细教程)
    一、简介 Maven是意第绪语,意思是“知识的积累者”,最初是为了简化JakartaTurbine项目中的构建过程。有几个项目,每个项目都有自己的Ant构建文件,所有项目都略有不同。JAR已检入CVS。我们想要一种标准的方式来构建项目,清晰地定义项目的组成,一种简单的方式来发布项目信息,以及一......