Makefile及GCC编译

合集下载

c语言makefile编写实例

c语言makefile编写实例

c语言makefile编写实例Makefile是用来管理程序编译的工具,可以方便地管理程序的编译过程。

使用Makefile可以大大简化程序的编译过程,提高程序的可维护性。

Makefile的语法比较简单,主要由目标、依赖和命令三部分组成。

下面我们以一个简单的C程序为例,来介绍如何使用Makefile进行编译。

假设我们有一个名为hello.c的程序,代码如下:```c#include <stdio.h>int main(){printf("Hello, world!\n");return 0;}```我们需要使用gcc编译器将其编译成可执行文件。

下面是一个简单的Makefile:```makefilehello: hello.cgcc -o hello hello.c```这个Makefile很简单,它定义了一个名为hello的目标,该目标依赖于hello.c文件,并使用gcc命令将其编译成可执行文件。

如果我们在终端中输入make命令,Makefile会自动执行编译过程:```$ makegcc -o hello hello.c```Makefile还可以定义多个目标,每个目标可以有多个依赖和多个命令。

下面是一个稍微复杂一些的Makefile:```makefileCC=gccCFLAGS=-Wall -gall: hello goodbyehello: hello.o$(CC) $(CFLAGS) -o hello hello.ogoodbye: goodbye.o$(CC) $(CFLAGS) -o goodbye goodbye.ohello.o: hello.c$(CC) $(CFLAGS) -c hello.cgoodbye.o: goodbye.c$(CC) $(CFLAGS) -c goodbye.cclean:rm -f *.o hello goodbye```这个Makefile定义了两个目标:all和clean。

gcc makefile文件的编写

gcc makefile文件的编写

常用的vim命令 命令 常用的
光标命令:(可视模式下) 光标命令:(可视模式下) :(可视模式下 k、j、h、l—上下左右光标移动命令。 上下左右光标移动命令。 、 、 、 上下左右光标移动命令 nG—调转命令,n为行数,该命令使光标立即跳到指定的行数。 调转命令, 为行数 该命令使光标立即跳到指定的行数。 为行数, 调转命令 Ctrl+G—光标所在位置的行数和列数。 光标所在位置的行数和列数。 光标所在位置的行数和列数 编辑命令: 可视模式下) 编辑命令: (可视模式下) i—从可视命令模式进入文本编辑模式。 从可视命令模式进入文本编辑模式。 从可视命令模式进入文本编辑模式 esc键—放回到可视命令模式。 放回到可视命令模式。 键 放回到可视命令模式 查找命令: 可视模式下) 查找命令: (可视模式下) /string 、? 、?String—从光标所在的行向前向后查找相应的字符 从光标所在的行向前向后查找相应的字符 串。 拷贝复制命令: 可视模式下) 拷贝复制命令: (可视模式下) yy—拷贝一行到剪切板 拷贝一行到剪切板 p—粘贴剪切板的内容 粘贴剪切板的内容 在冒号命令方式下: ,表示从当前光标处开始复制n行内容到 在冒号命令方式下:yn,表示从当前光标处开始复制 行内容到 剪切板。将光标移到相应的位置, 即可粘贴剪切板的内容。 剪切板。将光标移到相应的位置,按p即可粘贴剪切板的(可视模式下) 编辑命令(可视模式下)
dd—删除整行命令 删除整行命令 u—恢复前一次的删除动作 恢复前一次的删除动作
冒号命令方式命令 :q—退出命令 退出命令 :w—存档 存档 :wq—存档退出 存档退出 放弃任何改动, :q!--放弃任何改动,强行退出 ! 放弃任何改动
GUNMakeFile、Makefile和makefile 、 和

LinuxMakefile生成.d依赖文件以及gcc

LinuxMakefile生成.d依赖文件以及gcc

LinuxMakefile生成*.d依赖文件以及gcchttps:///qq1452008/article/details/50855810 1. 为什么要使用后缀名为 .d 的依赖文件?在 Makefile 中,目标文件的依赖关系需要包含一系列的头文件。

比如main.c 源文件内容如下:#include "stdio.h"#include "defs.h"int main(int argc, char *argv[]){printf("Hello, %s!\n", NAME);return 0;}defs.h 头文件如下:#ifndef _DEFS_H_#define _DEFS_H_#define NAME"makefile"#endif _DEFS_H_那么依赖关系如下(依赖的文件省略了绝对路径):main.o : main.c stdio.h defs.h ...假设目标文件的依赖关系缺少了 defs.h 文件,当 defs.h 文件中的内容改变后,根本不会重新编译目标文件,这是致命的,因为目标文件内部引用了 defs.h 文件中的宏定义。

如果是一个比较大型的工程,我们必需清楚每一个源文件都包含了哪些头文件,并且在加入或删除某些头文件时,也需要一并修改Makefile,这是一个很没有维护性的工作。

为了避免这种繁重而又容易出错的事情,可以使用 C/C++ 编译器的“-M” 选项,即自动获取源文件中包含的头文件,并生成一个依赖关系。

例如,执行下面的命令:gcc -M main.c其输出如下:main.o : main.c defs.h由编译器自动生成依赖关系,这样做的好处有以下几点:•不必手动书写若干目标文件的依赖关系,由编译器自动生成•不管是源文件还是头文件有更新,目标文件都会重新编译2. 使用说明参数介绍:•-M•生成文件的依赖关系,同时也把一些标准库的头文件包含了进来。

windows makefile编译

windows makefile编译

windows makefile编译随着仓库中的代码越来越复杂,对于不同的平台和系统,不同的编译工具都被用来生成可执行文件。

在Windows平台上,Makefile是一种非常流行的编译工具,这篇文章将会详细介绍如何使用Windows Makefile来编译。

下面我们将分步骤阐述这个过程。

1. 安装编译工具首先需要安装MinGW编译工具。

MinGW是一个Windows下基于GNU编译器集合的开发环境,它包含了编译器和各种实用程序。

你可以在MinGW的官网上下载。

下载完成后,进行安装并将MinGW添加到系统路径中。

2. 创建Makefile接下来,需要创建一个Makefile来告诉Make怎么去编译代码以及链接库文件。

在Makefile中,可以定义一些常量和变量,来提高Makefile的重用性。

同时,还需要定义源代码和头文件的位置,以及生成的可执行文件的名称。

3. 编写Makefile下面是一个简单的Makefile的例子:```CC=gccCFLAGS=-c -WallLDFLAGS=-lmSOURCES=main.cOBJECTS=$(SOURCES:.c=.o)EXECUTABLE=myappall: $(SOURCES) $(EXECUTABLE)$(EXECUTABLE): $(OBJECTS)$(CC) $(OBJECTS) $(LDFLAGS) -o $@.c.o:$(CC) $(CFLAGS) $< -o $@```在这个例子中,我们定义了CC变量为gcc编译器,CFLAGS变量为编译选项。

同时,还定义了LDFLAGS变量为链接选项,SOURCES变量为源代码文件名称,OBJECTS变量为生成的目标文件对象名称,EXECUTABLE变量为生成的可执行文件名称。

对于Makefile中的命令,需要使用Tab键缩进来区分命令和规则。

在这个例子中,我们定义了一个默认目标all,它依赖于源代码和可执行文件。

C语言编译器gcc命令如何操作步骤

C语言编译器gcc命令如何操作步骤

C语言编译器gcc命令如何操作步骤C语言是一种高级编程语言,由于其结构化编程,声明式语法,高效性和可靠性,被广泛用于很多领域。

gcc是一种C语言编译器,是Unix系统中最常用的编译器之一,它可以编译C、C++、JAVA等语言。

本文将为读者介绍对于gcc编译器的基本概念、相关命令以及实践操作步骤。

一、gcc基本概念1. 什么是编译器?先来了解一下编译器的作用。

编译器是将高级语言编写的程序转换成计算机可执行的机器语言的软件程序。

程序员可以使用高级语言编写程序,编译器将高级语言转换成计算机能够理解的机器语言。

2. 什么是gcc?GCC是GNU编译器集合(GNU Compiler Collection)的缩写。

它是一个重要的语言编译器,可以编译C、C++、JAVA等语言的程序。

gcc包含了一系列的编译器,每一个编译器都可以编译不同的语言,它不仅是Linux系统中的常用编译器,也被广泛使用于其他操作系统中。

3. gcc优点- 开源软件:可以透明、高效地利用计算机系统资源,让整个编译过程更灵活。

- 软件体积小:由于每次都是重新编译,因此gcc生成的二进制文件体积很小。

- 可移植性:gcc可以在不同的操作系统上进行编译。

同一份源代码,在不同的系统上编译,可以得到相同的结果。

- 动态链接库:gcc支持动态链接库,可以减少程序的代码冗余问题。

二、gcc常用命令以下是gcc编译器的常用命令:1. gcc -ogcc命令使用" -o"选项可以把源文件编译成可执行文件,例如:```$ gcc -o hello hello.c```上述命令的含义是将hello.c文件编译成hello可执行文件。

2. gcc -cgcc命令使用" -c"选项将源文件编译成目标文件。

目标文件是不可执行的文件,它包含了已经编译过的程序的一部分,这些程序可以用作最终的可执行文件中的一部分。

例如:```$ gcc -c hello.c```上述命令的含义是将hello.c文件编译成目标文件hello.o。

makefile中gcc fatal error no input files

makefile中gcc fatal error no input files

makefile中gcc fatal error no input files在Makefile中使用GCC编译器时,如果你遇到"fatal error: no input files" 错误,这通常意味着编译器无法找到要编译的源文件。

这可能是由于几种原因引起的。

以下是一些可能导致此错误的常见原因和解决方法:1. 未指定源文件:-确保在Makefile中指定了要编译的源文件。

-例如,你的Makefile应该包含类似于:`gcc source.c -o output` 的命令。

2. 源文件不存在:-检查指定的源文件是否实际存在于你指定的路径中。

-确保文件名的拼写和大小写都正确。

3. Makefile中的规则错误:-确保Makefile中有正确的规则来指定如何编译源文件。

-例如,确保你的Makefile 中有类似于:```maketarget: source.cgcc source.c -o target```4. Makefile 中的变量问题:-如果你在Makefile中使用变量来表示源文件或目标文件,请确保变量的值是正确的。

-检查Makefile中与源文件相关的变量的定义。

5. 文件路径问题:-如果源文件位于其他目录中,请确保Makefile中的路径是正确的。

-可以使用`cd`命令进入源文件所在的目录,或者在Makefile中使用相对/绝对路径。

6. 文件扩展名问题:-确保文件扩展名正确,例如`.c` 对于C语言源文件。

以下是一个简单的Makefile示例:```make# Makefile# 定义目标和源文件TARGET = myprogramSOURCE = myprogram.c# 编译规则$(TARGET): $(SOURCE)gcc $(SOURCE) -o $(TARGET)# 清理规则clean:rm -f $(TARGET)```确保在你的Makefile中有类似于上述示例中的正确规则,目标文件和源文件的定义都正确。

gcc链接g++编译生成的静态库和动态库的makefile示例

gcc链接g++编译生成的静态库和动态库的makefile示例

gcc链接g++编译⽣成的静态库和动态库的makefile⽰例使⽤c++开发程序或者库时,将库提供给其他⼈使⽤。

然⽽使⽤者是使⽤c开发的程序,链接g++编译⽣成的库时,于链接gcc⽣成的库,有所不同。

⾸先是静态库,以链接g++编译⽣成的libmylib.a为例⼦mylib依赖于pthread,rt,math库,链接时必须放在mylib之后。

同时-Wl,--no-as-needed -ldl添加在末尾是必须的。

arm和x86有些不同,就是arm的gcc不会⾃动链接数学库math,需要⼿动添加链接。

1 CC=arm-linux-gnueabihf-gcc -std=c992 CCLDFLAGS= -L. -lmylib -lstdc++ -pthread -lrt -lm -Wl,--no-as-needed -ldl3 #CC=gcc -m32 -std=c994 #CCLDFLAGS=-L. -lmylib -lstdc++ -pthread -lrt -Wl,--no-as-needed -ldl56 all:test78 test.o:test.c9 $(CC) -I../inc/ test.c -c -o test.o1011 test:test.o libmylib.a12 $(CC) test.o -o test $(CCLDFLAGS)1314 .PHONY: clean1516 clean:17 -rm test test.o -fgcc链接g++⽣成的动态库⽰例:libmylib.so库,使⽤g++编译时,静态链接了stdc++库(-static-libstdc++)。

1 CC=gcc -m32 -std=c992 #CC=arm-linux-gnueabihf-gcc -std=c993 CCLDFLAGS=-lstdc++ -L. -lmylib45 Root:root67 root.o:test.c8 $(CC) -I../inc/ test.c -c -o root.o910 root:root.o libmylib.so11 $(CC) root.o -o root $(CCLDFLAGS)121314 .PHONY: clean1516 clean:17 -rm root *.o。

MakeFile详解

MakeFile详解

引用其它的Makefile-实例



有这样几个Makefile:a.mk、b.mk、c.mk,还有 一个文件叫foo.make,以及一个变量$(bar),其 包含了e.mk和f.mk,那么,下面的语句: include foo.make *.mk $(bar) 等价于: include foo.make a.mk b.mk c.mk e.mk f.mk

在大多数时候,由于源文件太多,编译生成的中间目标文 件太多,而在链接时需要明显地指出中间目标文件名,这
对于编译很不方便,所以,通常要给中间目标文件打个包,
在Windows 下这种包叫“库文件”(Library File),也就 是 .lib 文件,在UNIX 下,是Archive File,也就是 .a 文件。
定义变量和引用变量
变量的定义和应用与Linux环境变量一样,变量名 要大写,变量一旦定义后,就可以通过将变量名 用圆括号括起来,并在前面加上“$”符号来进行 引用。 变量的主要作用: 1、保存文件名列表 2、保存可执行命令名,如编译器 3、保存编译器的参数 变量一般都在makefile的头部定义。按照惯例, 所有的makefile变量都应该是大写。
者,通常是你需要告诉编译器头文件的所在位置,只要所有的语法正
确,编译器就可以编译出中间目标文件。一般来说,每个源文件都应 该对应于一个中间目标文件(O 文件或是OBJ 文件)。
孙钦东
程序的编译和链接

链接时,主要是链接函数和全局变量。链接器并不管函数
所在的源文件,只管函数的中间目标文件(Object File)。



clean: -rm -f $(EXEC) *.elf *.gdb *.o
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Makefile及GCC编译选项培训
-fno-builtin fno不识别不以两个下划线开头的内置函数,目前受影响的函数包括abort ,abs,alloca,cos,exit,fabs,ffs,labs,memcmp,memcpy,sin,sqrt, strcmp,strcpy和strlen。 一般情况下GCC会采用特殊代码更高效地实现特定的内置函数。比如 调用alloca会变成若干直接调整堆栈的单一指令,而调用memcpy 会变成直 接插入的复制循环。这样产生的代码更小更快,而由于代码中没有了函数 调用,无法在这些调用中设置断点,也不能通过连接不同的库来改变这些 函数的功能。 -ansi 开关禁止函数alloca和ffs成为内置函数,因为它们没有ANSI标准 下的意义。
Makefile及GCC编译选项培训
Makefile中变量的使用: Makefile中变量的使用: 中变量的使用
objects = main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o edit : $(objects) cc -o edit $(objects) 用包含“+=”的一行可以为变量附加文本,如: objects = main.o foo.o bar.o utils.o objects += another.o 等同于: objects = main.o foo.o bar.o utils.o objects := $(objects) another.o 如果变量此前没有定义,“+=”与普通的“=”相同。但在此前有定 义的情况下,“+=”按照变量初始定义的类型扩展。
Makefile及GCC编译选项培训
变量使用范例: 变量使用范例:
foo : foo.c -lcurses cc $^ -o $@ 会解释为以下的命令 cc foo.c /usr/lib/libcurses.a -o foo
我们不推荐使用自动变量,虽然这样可以简化makefile的写作。 我们不推荐使用自动变量,虽然这样可以简化makefile的写作。 makefile的写作
ห้องสมุดไป่ตู้
Makefile及GCC编译选项培训
-c 编译汇编源文件,不进行连接。最后的输出是为每一个源文件 生成一个目标文件。 缺省情况下,生成的目标文件名是将源文件名的后缀“.c”、 “.i”、“.s”等替换为后缀“.o”。 忽略不可识别的输入文件,不对其进行编译或汇编。
Makefile及GCC编译选项培训
Makefile及GCC编译选项培训
编译开关使用说明: 编译开关使用说明:
运行GNU CC一般会完成预处理、编译、汇编和连接四个过程。 “全局开关”允许在其中某个中间阶段停止这一过程。例如,“c”开关就要求不进行连接,这样得到的输出就是汇编程序输出的目 标文件。 其它开关则是传递给其中某一处理阶段的。某些开关是控制预 处理器的,某些是控制编译器本身的。还有一些控制汇编程序和连 接程序的开关,很少会被使用到。
Makefile及GCC编译选项培训
-x language 明确指定后面输入文件的语言为language(而不是让编译器根 据文件名后缀选择一个缺省值)。此选项影响后面的所有输入文件 ,一直到下一个 –x 选项。
language可取的值为:
cc c-header cppc++-cppcpp-output c++ c++-cpp-output objective- objc-cppobjective-c objc-cpp-output assembler-withassembler assembler-with-cpp ada f77-cppf77 f77-cpp-input ratfor java
Makefile及GCC编译选项培训
Makefile的基本规则 的基本规则: 的基本规则
简单的构造文件包含如下形式的规则: TARGET ... : DEPENDENCIES ... COMMAND ... ... TARGET 一般是程序生成的文件名,如可执行文件或目标文件。它 也可以是某个要执行的操作的名称,比如“clean”。 DEPENDENCIES 是生成目标所用的输入文件。一个目标可以依靠 多个文件。 COMMAND 是make要执行的操作。一条规则可以包含多个命令, 一个命令占一行。注意:在每行命令前需要有一个tab字符。
Makefile及GCC编译选项培训
-ansi
支持所有ANSI标准的C程序。 这个开关不支持那些GNU C中与ANSI C 不兼容的特性,如关键词asm,inline和typeof,以及标明所用系统类型的预 定义宏,如unix和vax。它同时支持不受欢迎而且很少使用的ANSI三字母词 特性,不允许“$”作为标识符的一部分,不识别C++风格的“//”注释。 在使用了“-ansi”开关后,替代的关键词__asm__,__extension__, __inline__和__typeof__继续有效。替代的预定义宏__unix__和__vax__也可 以继续使用,无论此开关是否使用。 -ansi 开关并不会导致非ANSI程序被无故拒绝,为此需要同时使用“pedantic”开关。 使用了“-ansi”开关后,函数alloca,abort,exit和_exit将不是内置函数。
-S 在完全编译后结束,不进行汇编处理。输出的是每一个非汇编 输入文件相应的汇编码格式文件。 缺省情况下,生成的汇编文件名是将源文件名的后缀“.c”、 “.i”等替换为后缀“.s”。 忽略不需要进行编译的输入文件。
Makefile及GCC编译选项培训
-o file 将输出保存在文件file里,无论输出是何种格式,可执行文件 、目标文件、汇编文件或预处理过的C代码。 由于只能指定一个输出文件,所以在编译多于一个输入文件时 使用-o选项没有意义,除非输出是生成一个可执行文件。 如果没有使用-o选项,则在缺省情况下,可执行文件保存为 a.out, .o,其汇编码文件 a.out source.suffix的目标文件保存为source.o 保存为source.s .s,所有预处理过的C代码发往标准输出设备。
Makefile及GCC编译选项培训
控制C语言变种的开关: 控制C语言变种的开关:
-ansi -std=standard -aux-info filename -fno-asm -fno-builtin -fno-builtin-function -fhosted –ffreestanding -trigraphs -no-integrated-cpp -traditional -traditional-cpp -fallow-single-precision -fcond-mismatch -fsigned-bitfields -fsigned-char -funsigned-bitfields -funsigned-char -fwritable-strings
参考文档 <GNU make.htm>
Makefile及GCC编译选项培训
GCC简介: GCC简介: 简介
现在多个版本的编译器(C、C++、Objective-C、Ada、Fortran 和Java )已经被集成在一起,因此我们将GCC 称为“GNU 编译器集 ”(GNU Compiler Collection)。GCC 是GNU编译器集的常用缩写 ,它既是该编译器最普遍的名称,也是在强调用来编译C程序时所用 的名称(以前代表“GNU C编译器”的缩写)。 在特指C++编译时,该编译器常被称为“G++”。因为只存在一 个编译器,所以把它称为“GCC”也是准确的。但“G++”更多地用 于强调编译的是C++程序。 在我们谈论Ada编译的时候,也因此常把编译器称作“GNAT”。 我们用“GCC”指代整个编译系统,尤其是编译器中与编程语言 无关的那部分。
Makefile及GCC编译选项培训
7. 字符串“constants”不必为常量,被存储在可写内存,而与之相同的常量 被分开存储。(与“-fwritable-strings”开关的效果相同。) 8. 所有没有声明register的自动变量由longjmp进行保护。一般情况下, GNU C遵从ANSI C:没有声明为volatile的自动变量可以被保护。 9. 字符串“\x”和“\a”被处理为字符“x”和“a”。不打开“-traditional”开关,“\x” 是表示字符的十六进制数的前缀,“\a”产生一次振铃。 10. 在C++程序中,“-traditional”开关允许对this进行分配。(“-fthis-isvariable”也有此效果。) 11. 在预处理器中,注释被完全忽略。这就允许进行传统的标志连接。 12. 在预处理指令中,每一行必须以符号“#”开始。 13.在预处理器中,宏定义里的字符串常量被识别为宏参数(当它们出现在 上下文中时,虽然没有用引号括起来,其数值被字符串化)。预处理器 认为字符串常量以新行为结束。
Makefile及GCC编译选项培训
全局开关: 全局开关:
编译涉及的四个阶段依次为:预处理、完全编译、汇编和链接 。前三个阶段应用于一个单独的源文件,最后生成一个目标文件; 连接把所有目标文件(新编译的以及在输入里指定的那些文件)结 合成一个可执行文件。 对于给定的输入,编译器可以根据文件名的后缀决定进行哪一 种编译;但我们希望使用时通过选项“-x”明确指定编程语言。 以下为GCC支持的全局开关: pass-exit-c -S -E -o file -pipe -pass-exit-codes -x language --help --target target--version -v -### --help --target-help --version
相关文档
最新文档