Makefile及GCC编译
- 格式:ppt
- 大小:1.06 MB
- 文档页数:46
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。
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来编译。
下面我们将分步骤阐述这个过程。
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语言编译器,是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" 错误,这通常意味着编译器无法找到要编译的源文件。
这可能是由于几种原因引起的。
以下是一些可能导致此错误的常见原因和解决方法: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⽰例使⽤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。
【原+转】⽤CMake代替makefile进⾏跨平台交叉编译 在开始介绍如何使⽤CMake编译跨平台的静态库之前,先讲讲我在没有使⽤CMake之前所趟过的坑。
因为很多开源的程序,⽐如png,都是⾃带编译脚本的。
我们可以使⽤下列脚本来进⾏编译:./configure --prefix=/xxx/xx --enable-static=YESmakemake install 相信⼿动在类Unix系统上⾯编译过开源程序的同学对上⾯的命令肯定⾮常熟悉。
更悲惨的是,有些开源库是不提供configure配置⽂件的,只有⼀个Makefile或者Makefile.gcc。
我的体会是,Makefile是⼀个很复杂的东西,没有⼀定的积累我们是看不懂的,更别说去修改它了。
⽽本⽂的CMake可以更傻⽠更简单地达到我们的⽬的,你不需要理会复杂的makefile语法。
Just follow me! 如果不配置编译器和⼀些编译、链接参数,这样的操作,最后编译出来的静态库只能在本系统上⾯被链接使⽤。
⽐如你在mac上⾯运⾏上⾯的命令,编译出来的静态库就只能给mac程序链接使⽤。
如果在Linux上⾯运⾏上述命令,则也只能给Linux上⾯的程序所链接使⽤。
如果我们想要在Mac上⾯编译出ios和android的静态库,就必须要⽤到交叉编译。
要进⾏交叉编译,⼀般来说要指定⽬标编译平台的编译器,通常是指定⼀个CC环境变量,根据编译的是c库还是c++库,要分别指定C_flags和CXX_flag,当然还需要指定c/c++和系统sdk的头⽂件包含路径。
总之,⾮常之繁琐。
为什么要使⽤CMake 为什么我们不使⽤autoconf?为什么我们不使⽤QMake,JAM,ANT呢?具体原因⼤家可以参考我在本⽂最后的参考链接⾥⾯的⼀书的第⼀章。
我⾃⼰使⽤CMake的感受就是:我原来编写bash,配置configure参数,读各个开源库的INSTALL⽂件(因为不同库的configure参数有差别),配置各种编译flag,头⽂件包含等。
makefile gcc编译
Makefile 是一个用来组织代码编译的工具,而 GCC 是一个常用的 C 和 C++ 编译器。
在 Makefile 中使用 GCC 进行编译可以通过以下步骤完成:
1. 创建一个名为 "Makefile" 的文本文件,并确保它位于你的项目根目录下。
2. 在 Makefile 中定义你的编译规则。
例如,假设你有一个名为 "main.c" 的源文件需要编译成可执行文件 "app",你可以这样编写 Makefile:
make.
app: main.c.
gcc -o app main.c.
在这个例子中,我们定义了一个名为 "app" 的目标,它依赖于"main.c" 这个源文件。
当你运行 "make" 命令时,Make 工具会根
据这个规则来执行编译。
3. 打开终端,进入到包含 Makefile 的项目目录下。
4. 运行命令 "make"。
Make 工具会读取 Makefile 文件,并执行其中定义的编译规则。
在这个例子中,它会使用 GCC 编译器来编译 "main.c" 并生成可执行文件 "app"。
需要注意的是,Makefile 可以包含更复杂的规则和变量定义,以及支持多个源文件的编译。
你可以根据你的项目需求来进一步扩展和定制 Makefile 文件。
总之,通过合理编写 Makefile 并结合使用 GCC 编译器,你可以高效地组织和管理你的代码编译过程。