Linux下GCC和Makefile实例
- 格式:doc
- 大小:890.00 KB
- 文档页数:23
通用makefile文件(windows,linux)makefile的缺省目录结构如图所示,用户可以修改黄色部分的目录名,这是用户手动建立的。
注意图中黄色的makefile文件不能修改。
蓝色部分是make按照makefile文件自动生成的。
用户可以通过make命令修改最后产生的执行文件名称一般描述:首先手动创建根目录,此处创建的目录是d:\make-file,用户可以创建任意目录名称,根目录创建完成后,将makefile文件放于该文件夹内。
在根目录下手动创建inc和src两个文件夹,分别用于存放.h头文件和.c源文件,并将要编译的头文件和源文件放于这两个文件夹下。
缺省情况下,即运行命令make会编译链接inc和src文件夹下的源程序,将自动创建obj,dep和bin三个文件夹,其中obj文件夹下存放.o文件,dep文件夹下存放.d依赖文件,bin文件夹下存放生成的exe文件,缺省文件名为default.exe。
命令格式:Make [I_PATH= .h file directory] [C_PATH=.c file directory] [EXE = output .exe filename]命令描述:[]表示可选参数;I_PATH参数指定头文件路径,若不带I_PATH参数,make会到inc目录下查找头文件;C_PATH参数指定c文件路径,若不带C_PATH参数,make会编译src下的c文件;EXE参数指定输出可执行文件名,若不带EXE参数,会在bin目录下生成名字为default.exe 的可执行程序。
使用举例:make编译链接inc下的头文件和src下的源程序,在bin文件夹下生成名字为default.exe的可执行文件。
make EXE=tan.exe编译链接inc下的头文件和src下的源程序,在bin文件夹下生成名字为tan.exe的可执行文件。
make I_PATH=head编译链接head下的头文件和src文件夹下的源程序,在bin文件夹下生成名字为default.exe 的可执行文件。
linux的gcc使用方法Linux是一种开源的操作系统,广泛应用于服务器和嵌入式系统中。
而GCC(GNU Compiler Collection)是Linux下最常用的编译器套件之一,用于将源代码编译成可执行文件。
本文将介绍GCC的使用方法,帮助读者快速上手。
一、安装GCC在Linux系统中,默认情况下已经安装了GCC。
可以通过运行以下命令来验证是否已经安装了GCC:```gcc --version```如果GCC已经安装,则会显示GCC的版本信息;如果没有安装,则可以通过运行以下命令来安装GCC:```sudo apt-get install gcc```二、编写源代码在使用GCC之前,我们需要先编写源代码。
可以使用任何文本编辑器创建一个以.c为后缀的源文件,例如hello.c。
下面是一个示例的源代码:```c#include <stdio.h>int main() {printf("Hello, world!\n");return 0;}```三、编译源代码编写完源代码后,我们可以使用GCC来将其编译成可执行文件。
在终端中运行以下命令:```gcc -o hello hello.c```其中,-o参数用于指定编译后生成的可执行文件的名称,hello为示例的可执行文件名,hello.c为源代码文件名。
如果编译成功,GCC将会生成一个名为hello的可执行文件。
四、运行可执行文件在编译成功后,我们可以通过以下命令来运行可执行文件:```./hello```如果一切顺利,终端将会输出"Hello, world!"的字符串。
五、GCC的其他常用选项除了上述基本的使用方法外,GCC还提供了许多其他的选项,用于控制编译过程的行为。
以下是一些常用的选项:- -Wall:开启所有警告信息的显示。
- -g:生成供调试器使用的调试信息。
- -O2:进行优化处理,提高程序执行效率。
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•生成文件的依赖关系,同时也把一些标准库的头文件包含了进来。
一、开发平台搭建1.引言Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性。
而近年来,Linux操作系统在嵌入式系统领域的延伸也可谓是如日中天,许多版本的嵌入式Linux系统被开发出来,如ucLinux、RTLinux、ARM-Linux等等。
在嵌入式操作系统方面,Linux的地位是不容怀疑的,它开源、它包含TCP/IP协议栈、它易集成GUI。
鉴于Linux操作系统在服务器和嵌入式系统领域愈来愈广泛的应用,社会上越来越需要基于Linux操作系统进行编程的开发人员。
浏览许多论坛,经常碰到这样的提问:“现在是不是很流行unix/linux下的c编程?所以想学习一下!但是不知道该从何学起,如何下手!有什么好的建议吗?各位高手!哪些书籍比较合适初学者?在深入浅出的过程中应该看哪些不同层次的书?比如好的网站、论坛请大家赐教!不慎感激!”鉴于读者的需求,在本文中,笔者将对Linux平台下C编程的几个方面进行实例讲解,并力求回答读者们关心的问题,以与读者朋友们进行交流,共同提高。
在本文的连载过程中,有任何问题或建议,您可以给笔者发送email:21cnbao@,您也可以进入笔者的博客参与讨论:/21cnbao。
笔者建议在PC内存足够大的情况下,不要直接安装Linux操作系统,最好把它安装在运行VMWare 虚拟机软件的Windows平台上,如下图:在Linux平台下,可用任意一个文本编辑工具编辑源代码,但笔者建议使用emacs软件,它具备语法高亮、版本控制等附带功能,如下图:2.GCC编译器GCC是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:gcc [options] [filenames]options为编译选项,GCC总共提供的编译选项超过100个,但只有少数几个会被频繁使用,我们仅对几个常用选项进行介绍。
Linux顶层Makefile文件分析分类:Linux 系列2013-05-06 17:05 585人阅读评论(0) 收藏举报1、make menuconfigVERSION = 2PATCHLEVEL = 6SUBLEVEL = 26EXTRAVERSION =NAME = Rotary Wombat# *DOCUMENTATION*# To see a list of typical targets execute "make help"# More info can be located in ./README# Comments in this file are targeted only to the developer, do not# expect to learn how to build the kernel reading this file.# Do not:# o use make's built-in rules and variables# (this increases performance and avoids hard-to-debug behaviour);# o print "Entering directory ...";MAKEFLAGS += -rR --no-print-directory#-r禁止使用build-in规则#--no-print-directory是:不要再屏幕上打印"Entering directory.."#记住变量SHELL,MAKEFLAGS在整个make的执行过程中#始终被自动的传递给所有的子make# We are using a recursive build, so we need to do a little thinking# to get the ordering right.## Most importantly: sub-Makefiles should only ever modify files in# their own directory. If in some directory we have a dependency on# a file in another dir (which doesn't happen often, but it's often# unavoidable when linking the built-in.o targets which finy# turn into vmlinux), we will call a sub make in that other dir, and# after that we are sure that everything which is in that other dir# is now up to date.## The only cases where we need to modify files which have global# effects are thus separated out and done before the recursive# descending is started. They are now explicitly listed as the# prepare rule.# To put more focus on warnings, be less verbose as default# Use 'make V=1' to see the full commandsifdef V #v=1ifeq ("$(origin V)", "command line")KBUILD_VERBOSE = $(V) #把V的值作为KBUILD_VERBOSE的值 endifendififndef KBUILD_VERBOSE #即默认我们是不回显的#回显即在命令执行前显示要执行的命令KBUILD_VERBOSE = 0endif# 函数origin并不操作变量的值,只是告诉你你的这个变量是哪里来的。
Linux下C语⾔多⽂件的编译以及makefile的应⽤1.关于编译和链接⼀般来说,⽆论是C、C++,⾸先要把源⽂件编译成中间代码⽂件,在Windows下也就是.obj⽂件,UNIX下是.o⽂件,即Object File,这个动作叫做编译(compile)。
然后再把⼤量的Object File合成执⾏⽂件,这个动作叫作链接(link)。
也就是源⽂件(.c ⽂件或者.cpp⽂件)⾸先会⽣成中间⽬标⽂件,再由中间⽬标⽂件⽣成执⾏⽂件。
在编译时,编译器只检测程序语法,和函数、变量是否被声明。
如果函数未被声明,编译器会给出⼀个警告,但可以⽣成Object File。
⽽在链接程序时,链接器会在所有的Object File中找寻函数的实现,如果找不到,那到就会报链接错误码(Linker Error)。
2.使⽤命令编译链接 如果使⽤命令编译,过程⽐较⿇烦。
假如我有三个.h的头⽂件和四个.c的代码⽂件。
⾸先将这七个⽂件放到⼀个⽂件夹⾥(这⾥只介绍简单应⽤,所以放在⼀个⽂件夹,以后慢慢填坑)如下图。
接下来打开终端,并转到这个⽂件夹。
然后在终端输⼊gcc -c main.cgcc -c AAA.cgcc -c BBB.cgcc -c CCC.c 这样就把四个⽂件编译完成,查看⽂件会出现四个.o⽂件(下图) 接下来链接即可。
在终端输⼊gcc main.o AAA.o BBB.o CCC.o -o main 就可以⽣成可执⾏⽂件 main 这样执⾏ ./main即可。
整个执⾏过程如下:3.使⽤make编译链接虽然上述⽅式可以实现,但是只要修改⽂件就需要重新编译链接,特别⿇烦。
⽤makefile实现更为巧妙。
先放出⼀种写法,如果仅是为了执⾏⾃⼰的代码可以先看⼀下,后⾯的坑慢慢补。
objects = main.o AAA.o BBB.o CCC.occ = gccedit : $(objects)cc -o edit $(objects)main.o : main.cAAA.o : AAA.c AAA.hBBB.o : BBB.c BBB.hCCC.o : CCC.c CCC.h.PHONY : cleanclean :rm edit main.o AAA.o BBB.o CCC.o这样可以直接运⾏,我将刚才⽣成的编译链接⽂件删掉然后重新运⾏之后如果在make的时候出现makefile:3: *** missing separator:原因是丢失了tab键,每⼀条命令在执⾏的时候需要⼀个tab键。
makefile 加法
以下是一个简单的makefile示例,用于实现两个整数相加的操作:
```
# 定义变量
CC = gcc
CFLAGS = -Wall -g
TARGET = add
OBJS = main.o add.o
# 默认目标
all: $(TARGET)
# 生成可执行文件
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)
# 生成目标文件
%.o: %.c
$(CC) $(CFLAGS) -c $<
# 清除生成的文件
clean:
rm -rf $(TARGET) $(OBJS)
```
这个makefile中,定义了变量`CC`表示编译器的名称,
`CFLAGS`表示编译选项,`TARGET`表示最终生成的可执行
文件,`OBJS`表示需要编译的目标文件。
默认目标`all`指定了最终生成的可执行文件`$(TARGET)`依赖于目标文件`$(OBJS)`,在编译时使用了编译器和编译选项。
目标文件的生成规则使用了通配符`%`指定了规则,表示将所有的`.c`文件编译成对应的`.o`文件。
clean目标用于清除生成的文件。
编写好makefile文件后,在命令行中运行`make`命令即可编译生成可执行文件。
Linux下GCC与Makefile实例(从GCC得编译到Makefile得引入) 2011/10/29 by crazyant4 ments
一、确认已经装好了GCC与Make得软件包
可以使用whereis命令查瞧:
如果whereis gcc与whereis make命令有结果,说明安装了这两个软件,可以继续往下做。
二、使用GCC编译运行一个HelloWorld程序(只涉及单个文件)
可以在任何一个目录编写C程序然后编译运行,我这个实例在自己主目录进行:
然后就进入了编写程序得界面:
按下键盘”i”进入编辑界面,然后输入程序:
按ESC(进入命令行模式),然后输入”:wq”,冒号表示开始输入命令,字母w代表保存文件,字母q代表退出编辑器:
按回车退出vim编辑器,退回到终端,以下就是之后得编译运行截图:
三、使用GCC编译运行一个多文件程序(包含主程序与子程序)
这里我们要写两个C程序文件,一个文件里面写个被调函数,另外一个文件中main函数调用第一个文件得函数,如下所示:
ex_display、c得代码如下,同样得写完后ESC然后输入:wq退出:
输入如下得main函数代码:
然后保存退出,如下就是编译运行过程:
四、使用Makefile解决多文件编译运行得问题
正如上节得红框框里面所叙述,如果一个程序涉及得文件很多得话,每个都得写出来,很就是麻烦,所以Makefile就出现了,请瞧教程:
进入makefile得编辑界面后,输入如下内容:
然后保存退出,运行make命令:
五、Make script方法得对比
有人说,我把之前得所有命令,全写到shell script里面,不就达到Makefile得效果了,没错确实最终效果就是相同得,但就是Makefile却有这些好处:
•简化编译执行得命令(并没有gcc –c得过程)
•一次make后,下次只会编译改动得文件,其它得文件不会再编译了
其它还有一些优点,不过这第二个优点,对于大型项目来说,好处太大了!。