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

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

3天内不再提示

三个Makefile模板分享

STM32嵌入式开发 来源:STM32嵌入式开发 2023-07-10 09:07 次阅读

本文分享三个Makefile模板:编译可执行程序、编译静态库、编译动态库。

1 写在前面

对于Windows下开发,很多IDE都集成了编译器,如Visual Studio,提供了“一键编译”,编码完成后只需一个操作即可完成编译、链接、生成目标文件。 Linux开发与Windows不同,Linux下一般用的的gcc/g++编译器,如果是开发ARM下的Linux程序,还需用到arm-linux-gcc/arm-linux-g++交叉编译器。 Linux下也可以实现“一键编译”功能,此时需要一个编译脚本“Makefile”,Makefile可以手动编写,也可以借助自动化构建工具(如scons、CMake)生成。手动编写Makefile是Linux和Windows程序员的区别之一,一般地一个通用的Makefile能够适合大部分Linux项目程序。

2 三个Makefile模板

2.1 编译可执行文件Makefile

4c9f703e-1e2f-11ee-962d-dac502259ad0.png【要点说明】 【1】程序版本 开发调试过程可能产生多个程序版本,可以在目标文件后(前)增加版本号标识。 4cbd840c-1e2f-11ee-962d-dac502259ad0.png     【2】编译器选择     Linux下为gcc/g++;arm下为arm-linux-gcc;不同CPU厂商提供的定制交叉编译器名称可能不同,如Hisilicon“arm-hisiv300-linux-gcc”。 4cd55d16-1e2f-11ee-962d-dac502259ad0.png     【3】宏定义     开发过程,特殊代码一般增加宏条件来选择是否编译,如调试打印输出代码。-D是标识,后面接着的是“宏”。 4cee1d60-1e2f-11ee-962d-dac502259ad0.png     【4】编译选项     可以指定编译条件,如显示警告(-Wall),优化等级(-O)。 4cfcb582-1e2f-11ee-962d-dac502259ad0.png     【5】源文件     指定源文件目的路径,利用“wildcard”获取路径下所有依赖源文件。 4d0b02e0-1e2f-11ee-962d-dac502259ad0.png     【6】头文件     包含依赖的头文件,包括源码文件和库文件的头文件。 4d19cb22-1e2f-11ee-962d-dac502259ad0.png     【7】库文件名称     指定库文件名称,库文件有固定格式,静态库为libxxx.a;动态库为libxxx.so,指定库文件名称只需写“xxx”部分, 4d33f8f8-1e2f-11ee-962d-dac502259ad0.png     【8】库文件路径     指定依赖库文件的存放路径。注意如果引用的是动态库,动态库也许拷贝到“/lib”或者“/usr/lib”目录下,执行应用程序时,系统默认在该文件下索引动态库。 4d471d8e-1e2f-11ee-962d-dac502259ad0.png     【9】目标文件     调用“patsubst”将源文件(.c)编译为目标文件(.o)。 4d5b741e-1e2f-11ee-962d-dac502259ad0.png     【10】执行文件     执行文件名称 4d6d2646-1e2f-11ee-962d-dac502259ad0.png     【11】编译 4d80923a-1e2f-11ee-962d-dac502259ad0.png     【12】链接     可创建一个“output”文件夹存放目标执行文件。链接完输出目标执行文件,可以删除编译产生的临时文件(.o)。 4d9c3cc4-1e2f-11ee-962d-dac502259ad0.png     【13】清除编译信息     执行“make clean”清除编译产生的临时文件。 4db279e4-1e2f-11ee-962d-dac502259ad0.png

2.2 编译静态库Makefile

4dc75b48-1e2f-11ee-962d-dac502259ad0.png【要点说明】 基本格式与“编译可执行Makefile”一致,不同点包括以下。 【1】使用到“ar”命令将目标文件(.o)链接成静态库文件(.a)。静态库文件固定命名格式为:libxxx.a。

2.3 编译动态库Makefile

4dd70e1c-1e2f-11ee-962d-dac502259ad0.png【要点说明】 基本格式与“编译可执行Makefile”一致,不同点包括以下。 【1】编译选项和链接选项增加“-fPIC -shared ”选项。动态库文件固定命名格式为libxxx.so。

3 Demo

3.1 编译应用程序

编写测试例程,文件存放目录结构如下,头文件存放在“include”目录,库文件存放在“lib”目录,源文件存放在“source”目录,Makefile在当前目录下。 4defa666-1e2f-11ee-962d-dac502259ad0.jpg     源码1: 4e009b6a-1e2f-11ee-962d-dac502259ad0.png     源码2: 4e0f3418-1e2f-11ee-962d-dac502259ad0.png     主函数源码: 4e270c96-1e2f-11ee-962d-dac502259ad0.png     库文件,“./lib”目录下存放两个库文件,一个静态库libfun_a.a,一个动态库libfun_so.so。     Makefile文件即为“2.1节”的Makefile模板。     测试运行: 4e3a121e-1e2f-11ee-962d-dac502259ad0.jpg

【如果执行文件提示无“libfun_so.so”,则需拷贝“libfun_so.so”到根目录下的“/lib”或者“/usr/lib”目录下,因为系统执行程序,默认从该路径引脚动态库】

3.2 生成静态库

编写测试例程,生产的库文件即为“3.1节”调用的库文件(libfun_a.a)。文件存放目录结构如下: 4e564e66-1e2f-11ee-962d-dac502259ad0.png     源文件: 4e6bab44-1e2f-11ee-962d-dac502259ad0.png     Makefile文件即为“2.2节”的Makefile模板。     编译生成静态库: 4e7f8236-1e2f-11ee-962d-dac502259ad0.png

3.3 生成动态库

编写测试例程,生产的库文件即为“3.1节”调用的库文件(libfun_so.so)。文件存放目录结构如下: 4e9aa8fe-1e2f-11ee-962d-dac502259ad0.png     源文件: 4eb1e3ac-1e2f-11ee-962d-dac502259ad0.png     编译生成动态库: 4ec15a26-1e2f-11ee-962d-dac502259ad0.png 来源:https://blog.csdn.net/qq_20553613/article/details/90649734

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

    关注

    87

    文章

    10990

    浏览量

    206735
  • 模板
    +关注

    关注

    0

    文章

    106

    浏览量

    20478
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48614

原文标题:Linux下几个Makefile通用模板

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    三个腿的电容?????

    `原理图中三个腿的原件是电容吗?????麻烦哪位大神给分析下!!!!!`
    发表于 11-08 10:01

    labview中如何实现三个事件互锁?

    labview中如何实现三个事件互锁?即三个布尔量只允许一输出为TRUE,剩下两FALSE。有人能指点小弟一二吗
    发表于 10-26 14:25

    如何调整MPlab-ide生成的makefile

    你好!我试图修改MPLAB IDE生成的makefile,以便在编译每个文件之前执行代码检查器。我想修改makefile生成器或makefile模板,添加命令行来执行这个检查器,如果检
    发表于 09-02 13:15

    AD如何把三个用线绘成的边框在三个层上重合

    以上是三个用线画出来的边框,形状尺寸相同,只是在三个layer上。现在我想把三个边框在各自层上合并的一起,请问怎么做可以把位置对齐呢?
    发表于 06-13 17:06

    模板制造的三个主要技术是什么?有什么特点?

    模板制造的三个主要技术是什么?SMT模板的特点是什么?
    发表于 04-25 09:42

    使用Makefile+gcc编译STM32

    方式,那时已经使用Notepad++了,如今也一起在使用。Makefile模板如下:# STM32F103 Makefile模板# 参考来源:#
    发表于 11-22 08:10

    驾驭Makefile

    驾驭Makefile在网上你能找到很多关于Makefile的学习资料,但绝大部分给你的只是一个知识点,与将Makefile运用到项目中(尤其是大型项目)的差距非常的大。因为,将Makefile
    发表于 01-05 17:05 9次下载

    跟我一起学makefile

    关于makefile学习,深入了解嵌入式下makefile的编写
    发表于 05-23 18:21 0次下载

    makefile的基本语法

     在Makefile中,最重要的三个概念是:目标(target)、依赖关系(dependency)和命令(command)。目标是指要干什么,即运行make后生成什么;依赖是指明目标所依赖的其他目标;命令则告诉make如何生成目标,这
    发表于 11-12 10:15 1.1w次阅读

    Makefile是什么?Makefile工作原理是怎样的?Makefile经典教程免费下载

    Makefile的重要性 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件
    发表于 09-12 17:19 0次下载
    <b class='flag-5'>Makefile</b>是什么?<b class='flag-5'>Makefile</b>工作原理是怎样的?<b class='flag-5'>Makefile</b>经典教程免费下载

    Makefile的项目模板免费下载

    本文档的主要内容详细介绍的是Makefile的项目模板免费下载 可根据项目名称修改。
    发表于 06-12 08:00 11次下载
    <b class='flag-5'>Makefile</b>的项目<b class='flag-5'>模板</b>免费下载

    一个STM32编译Makefile模板

    一个STM32编译Makefile模板
    发表于 11-13 20:06 10次下载
    一个STM32编译<b class='flag-5'>Makefile</b><b class='flag-5'>模板</b>

    AVR-GCC Makefile 中文翻译

    所有的想要的功能都可以实现。但是我是个爱钻牛角尖人,呵呵。看了一下 WINAVR Makefile模板我觉得写得很好,学习了一下,翻译了一下,加上很多我的理解和注释。把它共享给大家,共同进步。这个M...
    发表于 11-15 13:36 35次下载
    AVR-GCC <b class='flag-5'>Makefile</b> 中文翻译

    Makefile】简单实用的Makefile模板来了

    【Linux + Makefile】简单实用的Makefile模板来了
    的头像 发表于 08-31 12:46 1643次阅读
    【<b class='flag-5'>Makefile</b>】简单实用的<b class='flag-5'>Makefile</b><b class='flag-5'>模板</b>来了

    Makefile】通用模板

    对于上述这样的多.c文件,又不在同一个目录下的大型工程中,借助makefile可以来减轻工作任务
    的头像 发表于 04-15 12:47 268次阅读
    【<b class='flag-5'>Makefile</b>】通用<b class='flag-5'>模板</b>