Linux系统编程makefile制作动态库和静态库

2023-11-19

目录

制作动态库

 制作静态库

首先准备简单的add.c,sub.c,main.c,head.h.具体代码如下

#head.h文件
int Add(int a, int b);
int Sub(int a, int b);

#add.c文件
#include <stdio.h>
int Add(int a, int b)
{
    return a + b;
}

#sub.c文件
#include <stdio.h>
int Sub(int a, int b)
{
    return a - b;
}

#main.c文件
#include "head.h"
#include <stdio.h>

int sum()
{
    int sum = 0;
    for(int i = 0; i < 20; i++)
    {
        sum += i;
    }
    return sum;
}

int main()
{
    printf("5 + 1 = %d\n", Add(5,1));
    printf("5 - 1 = %d\n", Sub(5,1));

    int sums = sum();
    printf("sum =  %d\n", sums);
    return 0;
}

制作动态库

我们把这些文件夹放在同一文件夹下。

如何我们在家目录即~目录建立lib文件夹,用于存放动态库,在./bashrc文件中添加环境变量,这样编译的动态库才能找到文件。

vi ~/.bashrc

#配置LD_LIBRARY_PATH  echo $HOME可查看家目录
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/liu/lib

#进行生效
source ~/.bashrc

#查看是否生效 如果环境变量中有你添加的变量就是生效成功了
echo $LD_LIBRARY_PATH

转到之前存放编译文件的文件夹

在当前文件夹调用vi makefile对makefile文件进行配置

#vi makefile进行编辑
#动态库的制作
target = libtest2.so
src = $(wildcard *.c)
objects = $(patsubst %.c, %.o, $(src))

$(target):$(objects)
	gcc -shared  $^ -o $@
	mv $@ ~/lib

%.o:%.c
	gcc -c -fpic $<
.PHONY:clean
clean:
#加入-表示该指令错了也会执行下面的指令 	-rm -r xxxxxx
	rm -f $(objects) $(target)

配置好调用make进行编译

 这样在家目录lib文件下就有了编译好的libtest2.so动态库

再到调用的地方加入head.h和调用函数main.c,配置makefile

#vi makefile
target = main
src = $(wildcard *.c)
objects = $(patsubst %.c, %.o, $(src))

$(target):$(objects)
	gcc -o $@ $< -L/home/liu/lib -ltest2

.PHONY:clean
clean:
#加入-表示该指令错了也会执行下面的指令 	-rm -r xxxxxx
	rm -f $(objects) $(target)

make执行文件

 

 制作静态库

静态库同样使用前面前面几个文件,直接对makefile文件进行修改。

#vi makefile
#静态库的制作
target = libtest1.a
src = $(wildcard *.c)
objects = $(patsubst %.c, %.o, $(src))

$(target):$(objects)
	ar rcs $@ $^
	mv $@ ~/lib

%.o:%.c
	gcc -c $<
.PHONY:clean
clean:
#加入-表示该指令错了也会执行下面的指令 	-rm -r xxxxxx
	rm -f $(objects) $(target)

# $< 第一个条件 $^所有条件

 编好规则后make执行规则

 执行后在~/lib就有我们制作的静态库,然后配置需要配置需要使用静态库的makefile

#vi makefile 代码类似动态库 唯一不同的库的名称
target = main
src = $(wildcard *.c)
objects = $(patsubst %.c, %.o, $(src))

$(target):$(objects)
	gcc -o $@ $< -L/home/liu/lib -ltest1

.PHONY:clean
clean:
#加入-表示该指令错了也会执行下面的指令 	-rm -r xxxxxx
	rm -f $(objects) $(target)

make对库进行编译。   ./main运行程序

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux系统编程makefile制作动态库和静态库 的相关文章

  • 如何通过ssh获取远程命令的退出代码

    我正在通过 ssh 从远程计算机运行脚本 ssh some cmd my script 现在 我想在本地计算机上存储 shell 脚本的退出状态 我该怎么做 假设没有任何问题ssh其本身 其退出状态是在远程主机上执行的最后一个命令的退出状态
  • 如何在Linux上用C/C++编写Web服务器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在考虑在 Linux 平台上开发一个小型 阅读 初级 Web 服务器 但我不知道从哪里开始 我希望它能够做的是 监听特定端口 接受
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • bash 将输出重定向到文件,但结果不完整

    重定向命令输出的问题已经被问过很多次了 但是我有一个奇怪的行为 我使用的是 bash shell debian 版本 4 3 30 1 release 并尝试将输出重定向到文件 但并非所有内容都记录在文件中 我尝试运行的 bin 文件是 l
  • 为什么 OS X 和 Linux 之间的 UTF-8 文本排序顺序不同?

    我有一个包含 UTF 8 编码文本行的文本文件 mac os x cat unsorted txt foo foo 津 如果它有助于重现问题 这里是文件中确切字节的校验和和转储 以及如何自己生成文件 在 Linux 上 使用base64 d
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • 在汇编中使用 printf 会导致管道传输时输出为空,但可以在终端上使用

    无输出 https stackoverflow com questions 54507957 printf call from assembly do not print to stdout即使在终端上 当输出不包含换行符时也有相同的原因
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • grep 排除文件的数组参数

    我想从我的文件中排除一些文件grep命令 为此我使用参数 exclude excluded file ext 为了更容易阅读 我想使用包含排除文件的 bash 数组 EXCLUDED FILES excluded file ext 然后将
  • ssh 连接超时

    我无法在 git 中 ssh 到 github bitbucket 或 gitlab 我通常会收到以下错误消息 如何避免它 输出 ssh T email protected cdn cgi l email protection i ssh
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • Linux 中 m 标志和 o 标志将存储在哪里

    我想知道最近收到的路由器通告的 m 标志和 o 标志的值 从内核源代码中我知道存储了 m 标志和 o 标志 Remember the managed otherconf flags from most recently received R

随机推荐

  • windows下使用FFmpeg生成YUV视频文件并播放(通过命令的方式)

    一 YUV的定义 YUV是一种颜色编码方法 它跟我们常见的RGB格式区分开来 常使用在各个视频处理组件中 其中 Y 代表明亮度 U 和 V 代表其色度 视频播放器把市面上流行的MP4等格式文件的视频部分解码出来 得到的一般会是YUV格式的数
  • Java方法重写注意事项

    系原创 只为需要它的人 Java方法重写的几个要求 重写的方法与父类方法签名 方法名称和参数列表 相同 子类重写的方法访问修饰符范围不能低于父类 父类的私有方法不能被重写 static修饰的方法不能被重写 返回值类型 如果父类中方法返回值类
  • 解决mybatis一对多只能获取部分数据的问题

    需求 building表和position表 Building类中含有List positionList mybatis查询方法需要查询到所有的building和building中含有所有的position 问题 sql语句和一对多方法写的
  • SQL如何进行优化

    SQL优化 前言 对于初级程序开发工程师而言 SQL是很多人的弱项 为此我给大家来做一下总结 希望能够帮到你们 课程说明 1 对MySQL SQL优化方案做讲解 学习如何排查慢查询 SQL优化 分页查询优化 一页一页的往下面翻这种查询方式
  • 针对读写操作频繁的应用系统的LINUX调优设置

    在线签约系统调优 项目类型 限制型应用 需要频繁调用 进行签章 调用的 保存在 磁盘中 项目业务设计实现 这里简要说明一下业务流程 前端业务系统过来的请求通过Nignx进行分流 通过网关DSS 将各自的请求转发到相应的老 新签章系统进行处理
  • 小白学Redis系列:Redis持久化

    Redis作为缓存数据库 区别于常规数据库的地方就在于Redis将数据存储在内存中 而不是硬盘中 因此数据的IO就十分快速 非常适合一些电商网站等数据IO频繁的场景 当然 内存中的数据在掉电之后就会被清空 而Redis的持久化功能使得内存中
  • linux后台运行之screen和nohup

    linux后台运行之screen和nohup 3 1 nohup命令 如果你正在运行一个进程 而且你觉得在退出帐户时该进程还不会结束 那么可以使用nohup命令 该命令可以在你退出帐户 关闭终端之后继续运行相应的进程 nohup就是不挂起的
  • 进制及进制转换详解。原码、反码、移码,补码区别介绍。(通俗易懂)

    目录 前言 一 十进制 n进制 进制转换详解 1 先说说什么是进制 2 二进制介绍 3 十进制 n进制 进制转换详解 重点 十进制 gt n进制 2 8 16 n进制 2 8 16 gt 十进制 非十进制间的互相转化 二 原码 反码 移码
  • Python数据可视化 - 如何自定义Matplotlib图例?

    Python数据可视化 如何自定义Matplotlib图例 Matplotlib 是一个最常用的Python数据可视化库 它允许我们创建各种类型的图形 包括直方图 折线图 散点图 饼状图等 当我们绘制多个子图或多个曲线时 我们可能需要图例来
  • SpringBoot 整合 ElasticSearch

    整合前先理解几个概念 与关键字 开始前给大家推荐一款很火的刷题 面试求职网站 https www nowcoder com link pc csdncpt xiaoying java 索引
  • Java编程练习题:Demo96 - Demo105(多维数组)

    目录 Demo96 代数方面 两个矩阵相乘 编写两个矩阵相乘的方法 Demo97 距离最近的两个点 程序清单8 3给出找到二维空间中距离最近的两个点的程序 修改该程序 让程序能够找出在三维空间上距离最近的两个点 Demo98 最大的行和列
  • flink-addSource和addSink分别是kafka、自定义数据、mysql、hbase的java实现

    flink主程序 public class FinkTest public static void main String args throws Exception StreamExecutionEnvironment env Strea
  • Python 和 A-frame实现从图像创建 3D 模型--附完整示例代码

    介绍 虚拟现实是指由计算机生成的模拟 允许用户使用特殊耳机进行交互 简而言之 它是由计算机创建的另类现实 而耳机可以让人们沉浸在该现实中 根据 Allied Market Research 的数据 到 2026 年 VR 内容创作市场将达到
  • 基于若依框架的微信小程序登录

    一 用户表结构 CREATE TABLE bus user user id varchar 32 COLLATE utf8mb4 bin NOT NULL COMMENT 用户id parent id varchar 32 CHARACTE
  • 秋招提前批已来,万字长文教你如何增加面试大厂的成功率

    本文是笔者在春季在 前端早早聊 手动笔芯 的面试专场分享的文字稿 主要针对前端社招 校招和实习的同学仅供参考 感兴趣的同学可以点击链接查看PPT和录屏 前端如何提高面试大厂的通过率 字节跳动秋季招聘提前批已经启动 欢迎投递幸福里业务线 内推
  • 嵌入式 ARM 汇编编程例题

    文章目录 用汇编语言实现 128 位数的减法 已知 32 位变量 X Y 存放在存储器的地址 0x90010 0x90014 中 要求实现 Z X Y 其中 Z 的值存放在 0x90018 中 已知 32 位有符号数 X 存放在存储器的地址
  • python request第三方库介绍

    python request第三方库介绍 快速上手 迫不及待了吗 本页内容为如何入门Requests提供了很好的指引 其假设你已经安装了Requests 如果还没有 去 安装 一节看看吧 首先 确认一下 Requests 已安装 Reque
  • mybatis查询mysql时间格式化 DATE_FORMAT

    在数据库中对应的是DateTime 查询参数为String类型 缺少时分秒的情况下使用 select from order where isDelete 0
  • 笔记 —— ByteArrayOutputStream

    内存输出流 ByteArrayOutputStream 此类实现了一个输出流 其中的数据被写入一个 byte 数组 缓冲区会随着数据的不断写入而自动增长 可使用 toByteArray 和 toString 获取数据 两个构造函数 1 By
  • Linux系统编程makefile制作动态库和静态库

    目录 制作动态库 制作静态库 首先准备简单的add c sub c main c head h 具体代码如下 head h文件 int Add int a int b int Sub int a int b add c文件 include