makefile简单helloworld
最近要在unix系统上开发c++应用程序,但默认情况下unix编译c++程序需要使用makefile。其实makefile语法还是比较简单,看上去有点像ant。废话不说了,直接上helloworld。
编写了3个文件,分别是file1.c、file2.c和file2.h。
file1.c代码:
- #include <stdio.h>
- #include "file2.h"
- int main() {
- printf("print file1$$$$$$$$$$$$$$$$$$$$$$$$\n");
- File2Print();
- return 0;
- }
file2.c代码:
- #include <stdio.h>
- #include "file2.h"
- void File2Print() {
- printf("Print file2**********************\n");
- }
file2.h代码:
- #ifndef FILE2_H_
- #define FILE2_H_
- #ifdef __cplusplus
- extern "C" {
- #endif
- void File2Print();
- #ifdef __cplusplus
- }
- #endif
- #endif
先来个比较基础的makefile列子:
- helloworld : file1.o file2.o
- gcc file1.o file2.o -o helloworld
- file1.o : file1.c file2.h
- gcc -c file1.c -o file1.o
- file2.o : file2.c file2.h
- gcc -c file2.c -o file2.o
- clean :
- rm -rf *.o helloworld
一个makefile 主要含有一系列的规则,如下:
A: B
(tab)<command>
(tab)<command>
每个命令行前都必须有tab符号。
上面的makefile文件目的就是要编译一个helloworld的可执行文件。让我们一句一句来解释:
helloworld : file1.o file2.o: helloworld依赖file1.o file2.o两个目标文件。
gcc File1.o File2.o -o helloworld: 编译出helloworld可执行文件。-o表示你指定 的目标文件名。
file1.o : file1.c: file1.o依赖file1.c文件。
gcc -c file1.c -o file1.o: 编译出file1.o文件。-c表示gcc 只把给它的文件编译成目标文件, 用源码文件的文件名命名但把其后缀由“.c”或“.cc”变成“.o”。在这句中,可以省略-o file1.o,编译器默认生成file1.o文件,这就是-c的作用。
file2.o : file2.c file2.h
gcc -c file2.c -o file2.o
这两句和上两句相同。
clean: rm -rf *.o helloworld
当用户键入make clean命令时,会删除*.o 和helloworld文件。
如果要编译cpp文件,只要把gcc改成g++就行了。
写好Makefile文件,在命令行中直接键入make命令,就会执行Makefile中的内容了。
到这步我想你能编一个Helloworld程序了。
来个进阶的列子,主要是使用变量:
- OBJS = file1.o file2.o
- CC = gcc
- CFLAGS = -Wall -O -g
- helloworld : $(OBJS)
- $(CC) $(OBJS) -o helloworld
- file1.o : file1.c file2.h
- $(CC) $(CFLAGS) -c file1.c -o file1.o
- file2.o : file2.c file2.h
- $(CC) $(CFLAGS) -c file2.c -o file2.o
- clean:
- rm -rf *.o helloworld
这里我们应用到了变量。要设定一个变量,你只要在一行的开始写下这个变量的名字,后 面跟一个= 号,后面跟你要设定的这个变量的值。以后你要引用 这个变量,写一个$ 符号,后面是围在括号里的变量名。
CFLAGS = -Wall -O –g,解释一下。这是配置编译器设置,并把它赋值给CFFLAGS变量。
-Wall: 输出所有的警告信息。
-O: 在编译时进行优化。
-g: 表示编译debug版本。
这样写的Makefile文件比较简单,但很容易就会发现缺点,那就是要列出所有的c文件。如果你添加一个c文件,那就需要修改Makefile文件,这在项目开发中还是比较麻烦的。
再来一个更通用的写法,使用函数、变量来构成makefile程序。
- CC = gcc
- XX = g++
- CFLAGS = -Wall -O –g
- TARGET = ./helloworld
- SOURCES = $(wildcard *.c *.cpp)
- OBJS = $(patsubst %.cpp, %.o, $(SOURCES))
- $(TARGET):$(OBJS)
- $(XX) $(OBJS) -o $(TARGET)
- chmod a+x $(TARGET)
- clean:
- rm -rf *.o helloworld
函数1:wildcard
产生一个所有以'.c' 结尾的文件的列表。
SOURCES = $(wildcard *.c *.cpp)表示产生一个所有以.c,.cpp结尾的文件的列表,然后存入变量SOURCES 里。
函数2:patsubst
匹配替换,有三个参数。第一个是一个需要匹配的式样,第二个表示用什么来替换它,第三个是一个需要被处理的由空格分隔的列表。
OBJS = $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCES)))表示把文件列表中所有的.c,.cpp字符变成.o,形成一个新的文件列表,然后存入OBJS变量中。
最后说下比较有用的两个表达方式的用法$@和$<
- %.o:%.c
- $(XX) $(CFLAGS) -c $< -o $@
- @echo $@
- %.o:%.cpp
- $(XX) $(CFLAGS) -c $< -o $@
- @echo $@
makefile简单helloworld的更多相关文章
- Gcc的Makefile简单使用
Gcc的Makefile简单使用http://blog.chinaunix.net/uid-9330295-id-2425867.html
- makefile编写helloworld
相信在unix下编程的没有不知道makefile的,刚开始学习unix平台 下的东西,了解了下makefile的制作,觉得有点东西可以记录下. 下面是一个极其简单的例子: 现在我要编译一个Hello ...
- [编译] 1、第一个makefile简单例子
前言 本篇用一个最简单的例子引入makefile,教你编写第一个makefile 正文 在Download/aa文件夹下有a.c和makefile文件 litao@litao:~/Downloads/ ...
- SpringMVC学习简单HelloWorld实例
首先还是从一个简单的Hello World项目说起: 我机器的开发环境为: Ubuntu12.04(不同操作系统对本系列项目没有影响): 开发工具:Eclipse For JavaEE: 数据库:My ...
- makefile简单学习
前言 在C语言中,我们需要将源代码生成可执行的程序.这里面其实要经过非常多的步骤.参看下图: 这中间主要通过make命令,读取一种名为“makefile”或“Makefile”的文件来实现软件的自动化 ...
- MATLAB---make与makefile简单介绍
1 make.makefile概述 makefile定义了一系列的规则,来规定哪些部分先编译,哪些部分后编译,写好makefile以后,只需一个make命令就可以让整个工程完全自动编译,所以简单的说, ...
- Makefile简单编写实例
介绍一下Makefile的简单编写例子. 编写Makefile的规则就是: 目标文件:依赖文件 (tab)编译规则 现在我有一个文件目录结构为: 解释一下这几个文件.首先我创建makefile目录,底 ...
- makefile 简单介绍
使用与来源: makefile文件(可由./configure创建)被make命令读取,make 命令执行时,需要一个 Makefile 文件,以告诉 make 命令需要怎么样的去编译和链接程序. 功 ...
- 【Linux学习】 包含子目录的makefile简单应用
1 .目录结构 practice6 / ui / ui.h ui.c practice6 / dal / dal.h dal.c practice6 / bll / bll.h bll.c pr ...
随机推荐
- 管理 sendmail 的邮件队列
邮件队列是存储 sendmail 命令传送的邮件消息数据和控制文件的目录.缺省情况下,邮件队列是 /var/spool/mqueue. 邮件消息可能由于很多原因而排入队列. 例如: sendmail ...
- WEBGL 2D游戏引擎研发系列 第一章 <新的开始>
WEBGL 2D游戏引擎研发系列 第一章 <新的开始> ~\(≥▽≤)/~HTML5游戏开发者社区(群号:326492427) 转载请注明出处:http://html5gamedev.or ...
- Mac Please try running this command again as root/Administrator.
mac 终端安装程序,需要权限,出现以下提示语句: Please try running this command again as root/Administrator. 需要执行以下命令即可: s ...
- php将xml文件转化为数组:simplexml_load_string
<?php $str = <<<XML <?xml version="1.0" encoding="ISO-8859-1"?> ...
- html 字符串互转DOM
描述 拼动态HTML 字符串的时候,把HTML转DOM对象设置属性后,在转字符串 var str1="<ul><li>kim</li><li> ...
- 项目关联不上开源项目(library)
首先是add library的时候重新打开始始终显示关联错误,在reference中出现一个红叉,无论如何都解决不了,remove后重新添加也会有这个问题,Eclipse也没有任何出错提示. 最后在h ...
- 关于javascript跨域及JSONP的原理与应用
同源策略,它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的浏览器都会使用这个策略. 为什么需要同源策略,这里举个例子: 假 设现在没有同源策略,会发生什么事情呢? ...
- [LeetCode][Python]Regular Expression Matching
# -*- coding: utf8 -*-'''https://oj.leetcode.com/problems/regular-expression-matching/ Implement reg ...
- org.openqa.selenium.SessionNotCreatedException: A new session could not be created.
解决方案 1. 重新插拔手机. 2. 检查appium端口是否被占用,如是,杀掉占用了改端口的进程,然后重启appium. 3.
- java中log4j的使用体验
log4j相信大部分java开发者都已经很熟悉了,在此记录下自己的使用过程. 一.文件准备: 1.log4j.jar(我这里使用的版本是log4j-1.2.17.jar,在附件中提供下载) 2.log ...