二话不说,先上一个Makefile的源码。

基于下述的Makefile,可以直接执行命令:

编译: make   or   make -f Makefile all

清除: make clean  or  make -f Makefile clean

CC = g++CUR_PATH = $(PWD)FLAGS = -std=c++11 -O2 -W -Wall
FLAGS += -I/home/project/opencv/build/ -I/home/project/opencv/include/
FLAGS += -I/home/project/opencv/modules/calib3d/include
#FLAGS += ... 其他必要的头文件的路径LDFLAGS = -L../libopencv_calib3d.a
LDFLAGS += ./libopencv_core.a
LDFLAGS += ./libopencv_dnn.a
LDFLAGS += ./libopencv_core.a
LDFLAGS += ./libopencv_features2d.a
LDFLAGS += ./libopencv_flann.a
LDFLAGS += ./libopencv_gapi.a
LDFLAGS += ./libopencv_highgui.a
LDFLAGS += ./libopencv_imgcodecs.a
LDFLAGS += ./libopencv_imgproc.a
LDFLAGS += ./libopencv_ml.a
LDFLAGS += ./libopencv_objdetect.a
LDFLAGS += ./libopencv_photo.a
LDFLAGS += ./libopencv_stitching.a
LDFLAGS += ./libopencv_video.a
LDFLAGS += ./libopencv_videoio.a
LDFLAGS += ./libade.a
LDFLAGS += ./libIlmImf.a
LDFLAGS += ./libippicv.a
LDFLAGS += ./libippiw.a
LDFLAGS += ./libittnotify.a
LDFLAGS += ./liblibopenjp2.a
LDFLAGS += ./liblibprotobuf.a
LDFLAGS += ./liblibtiff.a
LDFLAGS += -ldl -lm -lpthread -lrtTARGET = mainSMP_SRCS = test_resize.cppOBJS  := $(SMP_SRCS:%.c=%.o)CFLAGS += $(FLAGS)MPI_LIBS = $(LDFLAGS).PHONY : clean allall: $(TARGET)
$(TARGET):$(OBJS)@$(CC) $(CFLAGS) -o $@ $^ -Wl,--start-group $(MPI_LIBS)  \Wl,--end-group,-gc-sections,-g@echo "start the compilexxxxxxxxxxxxxxxxxxxxxxx"@echo $(MPI_LIBS)@echo $@@echo $^@echo $(CFLAGS)@echo $(OBJS)@echo $(TARGET)clean:@rm -f *.o main

1. 分析Makefile的入口在 .PHONY的位置。

Makefile的target默认是文件,何为target?拿make clean举例,clean就可以认为是target。但是这里的clean并不希望是文件,而希望是Makefile中clean标识,所以使用.PHONY来伪造一下。总结就是:.PHONY后面的target表示的是一个伪造的target, 而不是真实存在的target文件。 .PHONY后面的target也是此Makefile所支持的命令。默认只执行make命令时,实际就想当于执行make all.

make则执行“all:”下面的内容,直到出现另外一个标识。

make clean则执行“clean:”下面的内容,直到出现另外一个标识。

注意:标识内容下面的空白(例如@echo $^之前的空白)均是tab,不是空格。

2. 依赖关系

all: $(TARGET)  或者 $(TARGET):$(OBJS) 这种,由冒号隔开,即存在依赖关系,表示前面的标识依赖后面的内容。其中$(TARGET) 表示取出TARGET中的值(即main),故all: $(TARGET)可以翻译为all: main。详细的可以参考下面链接中的说明:makefile文件中的依赖关系理解_墨墨无文的博客-CSDN博客_makefile 依赖

3. 编译

@$(CC) $(CFLAGS) -o $@ $^ -Wl,--start-group $(MPI_LIBS)  -Wl,--end-group,-gc-sections,-g

$(xxx)是取xxx中的值,用前面的内容,替换其中的值,就可以得到正常的编译命令。

4. 参数说明

1)@

放在整行之前,表示不打印此行内容。举例:@echo "start the compilexxxxxxxxx",实际打印出来的内容为“start the compilexxxxxxxxx”, 如果没有此@,则打印出两行,分别是:

echo "start the compilexxxxxxxxx"

start the compilexxxxxxxxx

2)-o

生成指定的输出文件。用在生成可执行文件时。默认的时候, gcc 编译出来的文件是 a.out,如果不想使用这个名字,则可以使用此关键字,后面跟你想要的可执行文件的名字即可。本事例使用的名字是-o $@

3)$@

表示目标文件。在此文中,$@的内容即是$(TARGET),即是main。所以-o $@即是-o main.

4)  $^

表示所有的依赖文件,以空格分隔。如果依赖文件中有重复,那么这个变量会去除重复文件,只保留一份。在此文中,$^的内容即是$(OBJS),即是$(SMP_SRCS:%.c=%.o),即是test_resize.cpp。更多符号意思可以参考下面的链接:Makefile中的一些符号介绍_guanghma的博客-CSDN博客_makefile 符号

5)--start-group and --end-group

如果有多个静态库文件需要一起编译,那可以使用这两个参数将库包含起来。并且静态库要放在源码的后面,gcc是对文件的放置顺序有要求的。切记切记。此文中源码$^ 放在了库文件$(MPI_LIBS)之前。大致原因是gcc先编译的文件,如果其中没有找到对应的函数,则将这些函数暂存为未解析的符号,然后再编译后面的文件是,从后面的文件中找此未解析符号对应的源码,如果有,则将未解析的符号进行删除。此过程只顺序进行一次,如果反过来,则未解析的符号就找不到对应的源码了,对导致编译错误。相信解释可以参考下面的链接:为什么gcc中'-l'选项的顺序很重要? [重复]_编程黑洞网

--start-group ... --end-group:之间的内容只能为文件名或-l选项;为了保证内容项中的符号能被解析,链接器会在所有的内容项中循环查找。这种用法存在性能开销,最好是当有两个或两个以上内容项之间存在有循环引用时才使用。

6)-l

指定静态库的名称(例如-lgcc、 -lgcc_eh 、-lc实际是指文件名为libgcc.a、libgcc_eh.a、libc.a的库),此文中用到了-ldl -lm -lpthread -lrt。

7)-g

告知编译器,在编译的时候,产生调试信息

8)-L

链接外部静态库与动态库的查找路径。编译器会自动解析后面的一个参数。此文中的语句LDFLAGS = -L../libopencv_calib3d.a实际可以拆分为2行即 LDFLAGS = -L. 和 LDFLAGS += ./libopencv_calib3d.a。

9)-std=c++11

使用C++11的标准。

10)-O2

优化级别。分为-O0 、-O1 、-O2 、-O3。编译器的优化选项的 4 个级别,-O0 表示没有优化, -O1 为默认值,-O3 优化级别最高

11)-I

头文件所在的路径。此文中使用多个-Ixxx,表示有多个头文件的路径。

12)echo

打印命令,可以作为调试时打印一些参数的值。

13)SMP_SRCS:%.c=%.o

将SMP_SRCS中所有的.c替换为.o

参考链接:

GCC编译器30分钟入门教程

GCC 参数详解 | 菜鸟教程

gcc 命令,Linux gcc 命令详解:基于C/C++的编译器 - Linux 命令搜索引擎

程序的编译链接过程 - 可可西 - 博客园

OpenCV : undefined reference to cv::imread()_Sunshine_in_Moon的博客-CSDN博客

实用的GCC Makefile语法及参数详解相关推荐

  1. AHK Msg相关语法、参数详解,设置Msg弹窗自动关闭

    AHK Msg相关语法.参数详解 Msg语法 Options(选项) Title(标题) Text(文本) Timeout(超时) 举例:AHK设置Msg弹窗n秒后自动关闭 更多Msg相关语法 Msg ...

  2. gcc命令常用选项参数详解

    gcc是GUN C和C++编译器,我们通常使用GCC时,编译器会依次做如下工作:preprocess(预处理),compilation(编译),assembly(汇编),link(链接).gcc提供了 ...

  3. Linux平台Makefile文件的编写基础篇和GCC参数详解

    问:gcc中的-I.是什么意思....看到了有的是gcc -I. -I/usr/xxxxx..那个-I.是什么意思呢 最佳答案 答:-Ixxx 的意思是除了默认的头文件搜索路径(比如/usr/incl ...

  4. Linux 之 编译器 gcc/g++参数详解

    2016年12月9日16:48:53 ----------------------------- 内容目录: [介绍]  gcc and g++分别是gnu的c & c++编译器 gcc/g+ ...

  5. [转]gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解

    背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间.这在使用静态库时,体现的更为严重.有时,我们只使用了静态库仅有的几个功 ...

  6. gcc -ffunction-sections -fdata-sections -Wl,–gc-sections 参数详解

    背景 有时我们的程序会定义一些暂时使用不上的功能和函数,虽然我们不使用这些功能和函数,但它们往往会浪费我们的ROM和RAM的空间.这在使用静态库时,体现的更为严重.有时,我们只使用了静态库仅有的几个功 ...

  7. g++编译命令使用以及参数详解

    gcc & g++现在是gnu中最主要和最流行的c & c++编译器 . g++是c++的命令,以.cpp为主,对于c语言后缀名一般为.c.这时候命令换做gcc即可.其实是无关紧要的. ...

  8. [Linux运维基础]全家桶详解!Linux中RPM包、wget下载、YUM安装、tar包、zip等包管理方式区别与参数详解,附wget下载源码包编译安装方法

    文章目录 一.RPM.tar.gz 1.rpm包格式 2.rpm包管理 3.tar包管理参数 二.wget 1.wget参数 2.wget下载源码包后编译安装 三.YUM 1.YUM工作原理 2. Y ...

  9. shutdown参数详解

    2008年08月24日 单位一台用于瑞星2008网络版杀毒软件升级的计算机下午下班时需要自动关闭,在网上搜索一下用系统自带的计划任务就可完成. 命令(在"运行"栏里输入): At ...

最新文章

  1. 电话订票每日开始时间(几点放票) - 北京本地宝
  2. relocation R_X86_64_32S against `.data‘ can not be used when making a PIE object; recompile with -fP
  3. Java基础—异常分类及处理
  4. 全国数据中心分布图上线 轻轻松松找机房
  5. SAP Cloud for Customer的work center显示逻辑
  6. 架构设计--仅是软件开发之第二大影响力?!
  7. Python3 正则相关
  8. VMware NSX词汇表
  9. mysql query generator_mybatis generator生成连接mysql与sqlserver的区别
  10. java如何实现下载_java 如何实现下载功能
  11. GTUG的推荐给大家的一本书
  12. Weka安装后无法打开
  13. 班迪录屏注册机(Bandicam)
  14. JAVA里面一加到一百等于多少_从1加到100等于多少 【求和算法汇总】
  15. 反函数求导:自然对数 ln是怎么得到的;为什么自然对数的导数是 1/ x;arcsin 和 arccos 的导数求算
  16. 浪潮英信服务器如何用u盘装系统,浪潮英信服务器操作系统安装指引V20-Inspur.PDF...
  17. 【Linux】gcc/g++的使用详解静动态库
  18. “飞天”就是一个操作系统,最重要的功能就是资源管理;这套系统简单说就是把所有资源抽象成一台计算机,并通过互联网提供计算服务。...
  19. OpenFlow协议初探——OpenFLow中的流和流表
  20. pcb板子开窗_PCB中 开窗 是什么意思?

热门文章

  1. [附源码]SSM计算机毕业设计大学生心理咨询网站JAVA
  2. 华为云ECS服务器中通过docker部署ELK-elasticsearch
  3. R语言安装本地包、Warning in system(cmd) : ‘make‘ not found、安装和R版本匹配的Rtools
  4. mysql进阶(二十七)数据库索引原理
  5. 简析翔云宝盒适合新手的一些内容和要素
  6. 软件许可证的隐性成本
  7. 最新坦克大战2022-全程开发笔记-1
  8. 仿微信朋友圈日期显示 时间戳格式化
  9. [Python爬虫] 六、数据提取之XPath与lxml类库
  10. Acwing 1077. 皇宫看守