三个Makefile模板分享

本文分享三个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
【要点说明】     【1】程序版本     开发调试过程可能产生多个程序版本,可以在目标文件后(前)增加版本号标识。     【2】编译器选择     linux下为gcc/g++;arm下为arm-linux-gcc;不同cpu厂商提供的定制交叉编译器名称可能不同,如hisilicon“arm-hisiv300-linux-gcc”。     【3】宏定义     开发过程,特殊代码一般增加宏条件来选择是否编译,如调试打印输出代码。-d是标识,后面接着的是“宏”。     【4】编译选项     可以指定编译条件,如显示警告(-wall),优化等级(-o)。     【5】源文件     指定源文件目的路径,利用“wildcard”获取路径下所有依赖源文件。     【6】头文件     包含依赖的头文件,包括源码文件和库文件的头文件。     【7】库文件名称     指定库文件名称,库文件有固定格式,静态库为libxxx.a;动态库为libxxx.so,指定库文件名称只需写“xxx”部分,     【8】库文件路径     指定依赖库文件的存放路径。注意如果引用的是动态库,动态库也许拷贝到“/lib”或者“/usr/lib”目录下,执行应用程序时,系统默认在该文件下索引动态库。     【9】目标文件     调用“patsubst”将源文件(.c)编译为目标文件(.o)。     【10】执行文件     执行文件名称     【11】编译     【12】链接     可创建一个“output”文件夹存放目标执行文件。链接完输出目标执行文件,可以删除编译产生的临时文件(.o)。     【13】清除编译信息     执行“make clean”清除编译产生的临时文件。
2.2 编译静态库makefile
【要点说明】     基本格式与“编译可执行makefile”一致,不同点包括以下。     【1】使用到“ar”命令将目标文件(.o)链接成静态库文件(.a)。静态库文件固定命名格式为:libxxx.a。
2.3 编译动态库makefile
【要点说明】     基本格式与“编译可执行makefile”一致,不同点包括以下。     【1】编译选项和链接选项增加“-fpic -shared ”选项。动态库文件固定命名格式为libxxx.so。
3 demo
3.1 编译应用程序
    编写测试例程,文件存放目录结构如下,头文件存放在“include”目录,库文件存放在“lib”目录,源文件存放在“source”目录,makefile在当前目录下。     源码1:     源码2:     主函数源码:     库文件,“./lib”目录下存放两个库文件,一个静态库libfun_a.a,一个动态库libfun_so.so。     makefile文件即为“2.1节”的makefile模板。     测试运行:
    【如果执行文件提示无“libfun_so.so”,则需拷贝“libfun_so.so”到根目录下的“/lib”或者“/usr/lib”目录下,因为系统执行程序,默认从该路径引脚动态库】
3.2 生成静态库
    编写测试例程,生产的库文件即为“3.1节”调用的库文件(libfun_a.a)。文件存放目录结构如下:     源文件:     makefile文件即为“2.2节”的makefile模板。     编译生成静态库:
3.3 生成动态库
    编写测试例程,生产的库文件即为“3.1节”调用的库文件(libfun_so.so)。文件存放目录结构如下:     源文件:     编译生成动态库: 来源:https://blog.csdn.net/qq_20553613/article/details/90649734

基于赛灵思VCU118开发板随附的 UltraScale+ 器件
压缩机的工作原理
基于虚拟仪器LabVIEW软件实现PID控制器远程监控系统的设计
苹果财报两大亮点:中国市场增长8%、印度iPhone销量创纪录
ASIC和FPGA设计优势和流程比较
三个Makefile模板分享
LED和OLED有什么区别?
机器视觉缺陷检测-边学边做-相机选取
机器学习对于物联网来说是什么地位
闲谈名侦探柯南中的变声器
招商银行科技办公室是如何朝区块链发力的
密封性测试设备有什么作用?
跟踪领先AV软件平台,探究其合作伙伴、AV 用例和其他有价值的信息
开发过程中是什么原因导致优先级翻转的?
为什么要扩展开源安全监控?
MIT教授:世界就是黑客帝国,人类在模拟游戏中扮演角色
Qualcomm携手谷歌助力 5G应用开发
全加法器的工作原理和电路解析
或受益于双十一和感恩节,富士康预期年底销售量仍然强劲
mp6是什么_爱国者mp6功能介绍