windows下使用makefile
转自 :https://www.cnblogs.com/repository/archive/2011/05/18/2050546.html
1. 准备工作:
程序:
MinGW-3.1.0-1.exe windows下的gcc,编译c语言的工具
下载地址: http://umn.dl.sourceforge.net/sourceforge/mingw/MinGW-3.1.0-1.exe
make 按照makefile规则编译程序的工具
位置 :window/system32下,如果没有可以在 http://www.mingw.org/download.shtml找到
配置环境:
环境变量配置 :
控制面板> 系 统 >高级 >环境变量 >系统变量 >添加MinGW 安装目录下的bin目录到path中去,或者命令行下运行:set PATH= MinGW 安装目录下的bin目录
把C:\WINDOWS\system32用上边方法添加到path中以找到make.exe
创建四个文件:
//---------------------------Main.c : ---------------------------// #include "stdio.h" main() { func(); printf("this is main\n"); getch(); }
//---------------------------func.c : ---------------------------// #include "stdio.h" func() { printf("this is func\n"); getch(); }
一个空文件,文件名为makefile或者Makefile,这个文件名是必须的因为make默认查找该文件
创建compile.bat文件
内容为:
make
cmd
2. 编写makefile
示例:
test:main.o func.o
gcc -o test main.o func.o
func.o:func.c
gcc -c func.c
main.o:main.c
gcc -c main.c
1行:生成test可执行文件,它的依赖于main.o func.o,也就是说生成test你得先生成它们,
2行:gcc前边必须是tab也就是7个空格,表示编译生成test
后边是依赖项的生成规则
然后运行compile.bat就可以生成test.exe文件了,同时会附加生成func.o和main,o两个中间代码的文件,类似于VC中的obj文件
- 3. makefile的编写规则
可以参看:http://www.stlchina.org/twiki/bin/view.pl/ScriptProgram/LearnMakefile
- 4. gcc的参数
同VC,TC等编译器不同,GCC其实是可以很方便的在提示符下编译程序的。GCC在提示符下编译程序,并没有如同VC那样的冗长而晦涩的编译参数。相反,却有着比VC更灵活且简短的参数。
不得不承认,不懂GCC编译参数的人,确实会损失一些GCC的强大功能。所以,我下面简单介绍一下GCC的一些基本编译参数。这里,我以C编译器为例。
编译二进制代码
$gcc -c yours.c -o yours.o |
使用这段指令,GCC将会把yours.c编译成yours.o的二进制代码。其中,yours.o就类似于VC,TC中的.obj文档。
编译最简单的小程序。
$gcc -o yours yours.c |
通过这条指令,GCC将会把yours.c源代码编译成名为yours的可执行程序。当然,您也可以将yours.c改成我们刚才介绍的yours.o文件。这样,gcc将使用编译刚才编译好的二进制文档来链接程序。这里,格式的特点是,-o 后面是一串文件列表,第一个参数是所编译程序的文件名,从第二个开始,就是您编译和连接该可执行程序所需要的二进制文档或者源代码。
编译时将自己的头文件目录设为默认头文件目录
$gcc -I”Your_Include_Files_Document_Path” -c yours.c -o yours.o |
这条指令中的-I参数将会把Your_Include_Files_Document_Path添加到你默认的头文件目录中。这样您将可以使用 #include <your_include.h>来导入头文件。
编译时使用自己的静态库存放目录
$gcc -L”Your_Lib_Files_Document_Path” -o yours yours.o |
这条指令将会让GCC在连接时除了在默认Lib存放目录中搜索指定的静态库以外,还会在Your_Lib_Files_Document_Path中搜索。
编译时使用静态连接库
$gcc -lyour_lib -o yours yours.o |
这条指令将会让GCC在连接时把 libyour_lib.a中您所用到的函数连接到可执行程序中。此处注意,GCC所使用的静态连接库是lib*.a格式的。在连接时,只且仅需要提供*的内容就可以了。
编译时使用优化
$gcc -O2 -c yours.c -o yours.o |
使用优化方式编译程序,其中除了-O2以外,还有-O3 -O1等等。他们代表不同的优化等级。最常用的,是-O2优化。当然,还有针对特殊CPU的优化,这里就不介绍了。
编译时显示所有错误和警告信息
$gcc -Wall -c yours.c -o yours.o |
GCC在默认情况下,将对一些如变量申请未使用这样的问题或者申请了没有给予初始值的问题忽略。但是,如果使用了-Wall参数,编辑器将列出所有的警告信息。这样,您就可以知道您的代码中有多少可能会在其他操作系统下出错的地方了。(用这个指令看看你的代码有多少地方写的不怎么合适。)
编译连接时,加入调试代码
$gcc -g -o yours yours.c |
正如同VC有debug编译模式一样,GCC也有debug模式。添加了-g 参数编译的可执行程序比普通程序略为大一些,其中添加了一些调试代码。这些代码将被gdb所支持。
连接时缩小代码体积
$gcc -s -o yours yours.o |
这个参数,似乎我没有在Unix环境下看到过。也不知道具体什么作用。因为有人说Visual-MinGW生成的代码小,于是研究了一下她的编译参数,发现release模式的编译参数就加了这一项。貌似编译后的代码的确缩小了很多。
获得帮助
$gcc --help |
这条指令从意思上就能看出,获得gcc的帮助信息。如果您有什么特殊需要,也许这个指令能帮上点小忙。
以上转自:http://blog.csdn.net/zhanghan3/archive/2006/10/14/1334308.aspx
原文地址:https://www.cnblogs.com/junjunjun123/p/11603518.html
- css渲染(一) 字体
- css渲染(二) 文本
- BZOJ 2463: [中山市选2009]谁能赢呢?(智商)
- excel导入与导出
- 【LeetCode 204】关关的刷题日记40 Number of Boomerangs
- 洛谷P1339 [USACO09OCT]热浪Heat Wave(最短路)
- excel导出类
- 我的HTML总结之常用基础便签
- php性能监测模块XHProf
- php dirname(__FILE__) 获取当前文件的绝对路径
- 洛谷P2939 [USACO09FEB]改造路Revamping Trails(最短路)
- 微信公众平台开发接口PHP SDK完整版
- 我的HTML总结之HTML发展史
- BZOJ 4152: [AMPPZ2014]The Captain(最短路)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 硬件笔记之GP106-90 3GB GTX1060 3GB魔改
- Java BigDecimal 的舍入模式(RoundingMode)详解
- 实际工程中加快 Java 代码编写的小提示
- CentOS7 离线安装软件并准备依赖包
- CentOS7 SkyWalking APM8.1.0 搭建与项目集成使用
- CentOS7 cassandra安装与测试
- Centos7 搭建DNS服务器
- CentOS7 fastdfs安装与测试
- CentOS7 jdk安装
- CentOS7 kafka安装
- Centos7 keepalived安装并监控mysql实现自动切换
- Centos7 mqtt集群安装
- CentOS7 mysql5.7安装并配置主主同步
- CentOS7 nginx安装并负载mysql
- CentOS7 zabbix安装并实现其它服务器服务监控报警与自动恢复