• GCC编译选项CFLAGS参数
  • GCC链接选项LDFLAGS参数
  • 实例

最近看了makefile的手册之后,发现还是不知道怎么写makefile,而且就连看也看的是云里雾里,就我现在工作当中看到的一些makefile文件,只能看个大概的意思,一旦涉及到文件添加、静态库、动态库等增加、删除;文件搜索路径等的修改就没法下手了,因此下定决心必须对我比较关注的地方进行深度学习,知其然还要知其所以然,知道怎么从无到有写出来,而且别人的makefile还要知道怎么根据需求的变化进行修改。但这不是一步就能能达到的,咱还是先全面理解别人写的makefile开始吧。
关于makefile的依赖规则以及目标生成的步骤,这篇先不介绍,这里主要关注我在看makefile时遇到的一堆CFLAGS与LDFLAGS定义进行说明。
费了牛劲,才查到GNUmake中文手册中关于CFLAGS与LDFLAGS的说明,他们都是是隐含规则的变量,且是一种命令参数变量;然后又到GCC手册中查找有哪些编译选项。
makefile内嵌隐含规则的命令中,所使用的变量都是预定义的变量。我们将这些变量称为“隐含变量”。这些变量允许对它进行修改:在Makefile中、通过命令行参数或者设置系统环境变量的方式来对它进行重定义。无论是用那种方式,只要make在运行时它的定义有效,make的隐含规则都会使用这些变量。

GCC编译选项CFLAGS参数

选项 说明
-c 用于把源码文件编译成 .o 对象文件,不进行链接过程
-o 用于连接生成可执行文件,在其后可以指定输出文件的名称
-g 用于在生成的目标可执行文件中,添加调试信息,可以使用GDB进行调试
-Idir 用于把新目录添加到include路径上,可以使用相对和绝对路径,“-I.”、“-I./include”、“-I/opt/include”
-Wall 生成常见的所有告警信息,且停止编译,具体是哪些告警信息,请参见GCC手册,一般用这个足矣!
-w 关闭所有告警信息
-O 表示编译优化选项,其后可跟优化等级0\1\2\3,默认是0,不优化
-fPIC 用于生成位置无关的代码
-v (在标准错误)显示执行编译阶段的命令,同时显示编译器驱动程序,预处理器,编译器的版本号

GCC链接选项LDFLAGS参数

选项 说明
-llibrary 链接时在标准搜索目录中寻找库文件,搜索名为liblibrary.aliblibrary.so
-Ldir 用于把新目录添加到库搜索路径上,可以使用相对和绝对路径,“-L.”、“-L./include”、“-L/opt/include”
-Wl,option 把选项 option 传递给连接器,如果 option 中含有逗号,就在逗号处分割成多个选项
-static 使用静态库链接生成目标文件,避免使用共享库,生成目标文件会比使用动态链接库大

实例

CFLAGS = -g -Wall -I./include -I./include/tinyalsa -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -lc
LDFLAGS = -L./lib
ALL:$(CC) $(CFLAGS) $(LDFLAGS) main.c gfifo.c queue.c usbmonitor.c socket_rcv_360_server.c ./lib/srs_librtmp.a ./lib/libcrypto.a ./lib/libssl.a ./lib/libtinyalsa.a -o media_record -static -ldl -lstdc++ -lm -lpthread
clean:rm media_record *.raw *.mp4 *.wav -rfCFLAGS = -g -Wall -I./include -I./include/tinyalsa -Wl,--whole-archive -lpthread -Wl,--no-whole-archive -lc
-g:生成调试信息
-Wall:输出全部的告警信息
-I./include:添加头文件搜索目录./include
-I./include/tinyalsa:添加头文件搜索目录./include/tinyalsa
-Wl,--whole-archive -lpthread:将libpthread.so及以后的库中的所有符号都链接进可执行目标文件
-Wl,--no-whole-archive:关闭之前的-Wl,--whole-archive -lpthread 选项
LDFLAGS = -L./lib,将makefile当前目录下的、lib文件夹添加到库文件搜索目录$(CC):makefile隐含变量,默认选择gcc编译器
$(CFLAGS):引用之前定义的CFLAGS变量,即编译选项参数
$(LDFLAGS):引用之前定义的LDFLAGS变量,即链接参数$(CC) $(CFLAGS) $(LDFLAGS) main.c gfifo.c queue.c usbmonitor.c socket_rcv_360_server.c ./lib/srs_librtmp.a ./lib/libcrypto.a ./lib/libssl.a ./lib/libtinyalsa.a -o media_record -static -ldl -lstdc++ -lm -lpthread
使用定的编译器、编译选项参数、链接选项参数,编译.c文件,并使用静态方式链接制定的库文件,以及编译器目录下的libdl.a、libstdc++.a、libm.a、libpthread.a库文件生成 media_record 可执行目标文件。

经过这几天的研究,已经对arm-linux-guneabi-gcc的一些编译选项、链接选项有一定的了接,现在可以写一些简单的makefile了,自己可以感觉到一点进步了,再接再厉吧。

Makefile 编译与链接选项及CFLAGS与LDFLAGS示例说明相关推荐

  1. Makefile 编译与链接选项及CFLAGS与LDFLAGS说明

    CFLAGS与LDFLAGS的说明,他们都是是隐含规则的变量,且是一种命令参数变量. makefile内嵌隐含规则的命令中,所使用的变量都是预定义的变量.我们将这些变量称为"隐含变量&quo ...

  2. gcc ------ 编译与链接选项及CFLAGS、LDFLAGS、LIBS

    gcc ------ 编译与链接选项及CFLAGS.LDFLAGS.LIBS GCC手册:https://gcc.gnu.org/onlinedocs/ GCC编译选项CFLAGS参数 选项 说明 - ...

  3. arm linux gcc fpic,【待整理】Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义

    [待整理]Gcc中编译和链接选项 -fpic -fPIC -fpie -fPIE -pie的含义 -fpic Generate position-independent code (PIC) suit ...

  4. arm-none-eabi-gcc编译、链接选项详解

    1.-mthumb 和 -mthumb-interwork "-mthumb"的意义是:使用这个编译选项生成的目标文件是Thumb指令的,目前还没有发现GNU编译器中有哪一个选项可 ...

  5. Makefile生成 静态链接库万能模板(当前文件夹、递归全部文件夹编译成.a)

    感谢:Makefile常用万能模板(包括静态链接库.动态链接库.可执行文件) https://www.bbsmax.com/A/Vx5MyvWv5N/ 单文件下makefile编译成静态 ###### ...

  6. 编译和链接的区别、makefile怎么写

    在多道程序环境中,要想将一个用户源代码变成一个可以在内存中执行的程序,通常分为三个步骤:编译.链接.载入. (1)编译:由编译程序将用户的源代码编译成若干个目标模块. (2)链接:由链接程序将编译后形 ...

  7. 交互系统的构建之(一)重写Makefile编译TLD系统

    交互系统的构建之(一)重写Makefile编译TLD系统 zouxy09@qq.com http://blog.csdn.net/zouxy09 为了对TLD系统做一些功能的填充,例如添加语音合成来提 ...

  8. Makefile编译选项:CFLAGS、LDFLAGS、LIBS

    目录 一.CFLAGS 二.LDFLAGS 三.LIBS 四.参考资料 前言 本文只涉及cflags.ldflags.libs,关于makefile文件非常建议看看大神写的系列博客<跟我一起写M ...

  9. linux makefile 编译标记 EXTRA_CFLAGS 简介

    1.介绍 EXTRA_CFLAGS,  EXTRA_AFLAGS,  EXTRA_LDFLAGS,  EXTRA_ARFLAGS 所有的EXTRA_变量只能使用在定义该变量后的makefile文件中. ...

最新文章

  1. bestcoder #71 1003 找位运算的最大生成树
  2. c#_continue 和 break 的区别
  3. javascript中的链表结构—双向链表
  4. wxWidgets:wxTextCtrl类用法
  5. java set方法不生效_使您的Java 8方法引用生效
  6. 女生做产品经理好吗_女生天生就是产品经理,不服来战!
  7. maven 安装后变成 mvn 不是内部命令解决方法
  8. arm-none-eabi-gcc.exe -v
  9. AS数据库自动备份的DOS语句
  10. 高等数学复习笔记(二)- 一元函数微分学的概念、计算以及几何应用
  11. stata面板数据单位根检验llc_干货分享 | 面板数据单位根检验软件操作和解读
  12. HC-05与JDY-09蓝牙模块对比与使用
  13. 计算机任务驱动法教学应用,“任务驱动法”在职教计算机教学中的应用
  14. 苹果芯片订单立功 台积电股价创新高
  15. 我学习网络管理员的第一步---各个时期的基本要求
  16. 华为荣耀8电信卡显示无服务器,华为荣耀手机实现双电信卡双待双通,5步告诉你真相...
  17. hadoop2和hadoop3的比较
  18. 三极管三种放大组态的比较?为什么共基频带宽呢?(硬件每日一题)
  19. 度小满数据开发面试真题1
  20. homeassistant中usb摄像头的使用(usb转web摄像头)

热门文章

  1. Java获取(外网)网络IP和本机真实IP Java获取真实IP Java获取真实ip Java获取本机ip Java获取 本机真实ip
  2. 考研时间查询时间,已经出炉啦
  3. webstorm安装插件失败怎么办?
  4. 数仓ADS层指标计算案例分享
  5. 有关 Mybatis 中使用el表达式问题
  6. 《静儿的服务治理私房菜》服务治理概述
  7. 荣耀v30pro升级鸿蒙,华为支持升级鸿蒙OS的机型推荐-升级鸿蒙OS机型榜单
  8. 长期使用计算机的危害,长期使用电脑危害大 3个方法可降低
  9. python计算回文数的方法_Python计算回文数的方法
  10. 交叉编译 openocd