于是开始找跨平台的编译工具,其中最有名的两个是 cmake 和 scons,cmake 之所以出名估计是因为 KDE 4 从 autotools 转向用 cmake 来编译。而 scons 则是 lighttpd 原来用的编译工具,它现在也转向 Python 了。cmake 和 python 大概代表了新一代跨平台编译工具的两种方向。第一种 (cmake) 是延续并改良传统 automake, autoconf 工具链,将之合为一体,但最终仍然生成 Makefile, Visual Studio 的 .sln,Xcode 的 .xcodebuild 文件,依赖现有编译工具 (make, nmake, vcbuild, xcodebuild) 来编译;第二种则是完全消除现有编译工具的调用,直接调用编译器,scons 就属于这一类 (scons 还有一个特点是完全不用专门的语言,控制编译的脚本就是 Python)。

从人气上 来说,反倒是走改良路线的 cmake 比 scons 好一些,有几个原因:scons 基于 Python,可能有些代码不是很照顾速度,于是类似 KDE 这样的大项目编译起来会很慢;scons 开发比较慢,最近一直只是 bugfix。不过相对 cmake,scons 的优点是文档非常细致可读,而 cmake 的文档则非常少,可以在网上找到的只有几篇介绍性的文章和参考手册,不像 scons 有一本 User Guide。

与之相关的工具还有 Jam (包括它的变体 FTJam, Boost.Build), Waf, Bakefile 等。其中比较新的 Waf 是一个 scons 的改进,在它的提供的 benchmark 中,显示通过缓存方式可以大大改进编译的速度。不过因为这个项目还很新,目前没有什么软件用它作为编译系统。

Bakefile 走的则是 cmake 的路子,从名称上也可以看出,它最终也是通过生成 Makefile 一类的文件来完成编译的。不过不同的地方在于 cmake 用的语法很像 autotools 用的 m4 的传统语法,而 bakefile 则完全用 XML 来定义编译规则了,这一点倒很像 ant。Bakefile 倒是有不少著名的项目使用,比如 wxWidgets, WebKit, VCF, libxml。

目的:

基本掌握了 make 的用法,能在Linux系统上编程。

环境:

Linux系统,或者有一台Linux服务器,通过终端连接。一句话:有Linux编译环境。

准备:

准备三个文件:file1.c, file2.c, file2.h
file1.c:
#include
#include "file2.h"
int main()
{
printf("print file1$$$$$$$$$$$$$$$$$$$$$$$$\n");
File2Print();
return 0;
}

file2.h:

#ifndef FILE2_H_
#define FILE2_H_

#ifdef __cplusplus

extern "C" {

#endif

void File2Print();

#ifdef __cplusplus

}

#endif

#endif

file2.c:
#include "file2.h"
void File2Print()
{
printf("Print file2**********************\n");
}

基础:

先来个例子:
有这么个Makefile文件。(文件和Makefile在同一目录)
=== 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 结束 ===

一个 makefile 主要含有一系列的规则,如下:
A: B
(tab)
(tab)

每个命令行前都必须有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程序了。

Makefile的关键是:
1。dependence rule;
2。action;
3。variable assignment and shell scripts.

Dependence rule写的是文件间的依赖关系,比如a.out是由a.o和libmylib.a生成的,a.o是由a.C编译而来的。写成makefile的dependence rule就是:
a.out:a.o libmylib.a
你可以用些的符号来写些通用的dependence rule,比如:
.C.o:
%.o:%.C
它的意思是所有的.o文件依赖于对应的.C文件。不同的make(比如GNU make,Sun make等)可能有不同的特殊符号。

Action就是定义该做什么,比如:
a.out:a.o libmylib.a
CC -o a.out a.o -lmylib
第一行是dependence rule,第二行是对应的动作。它们的意思是,如果a.o或libmylib.a比a.out新,就执行第二行。再如:
.C.o:
%.o:%.C
CC -g -c $<
意思是如果然后.C文件比对应的.o文件新,就编译它。注意,action rule一定不能用空格起头而是tab起头。

变量的赋值很简单:
<变量>=<值>
比如:
INCLUDEDIR=$(PROJECT_HOME)/include $(THIRDPARTY_HOME)/include
用变量时一定要用小括号:
.C.o:
CC -g -c $(INCLUDEDIR) $<
Shell script可能要先声明用什么shell:
SHELL=/usr/bin/sh
在makefile里写shell script和其它地方有许多不同。其中最大的不同是makefile中的shell script不能随便放换行符,我一般是把它们放用续行符("\")连起来.

要使VC产生*.MAK文件,你可以这样:
打开Tools菜单------------>Options------------------------->Build选项卡 ---------------------->在"Export makefile when saving project file"前面得方框打勾

如果您喜欢在命令行下工作,您需要执行在Developer Studio的BIN子目录下的VCVARS32.BAT来设置环境变数。要从命令行执行make档案,可以转到你得工程目录比如HelloMsg并执行:

NMAKE /f HelloMsg.mak CFG="HelloMsg - Win32 Debug"
或者

NMAKE /f HelloMsg.mak CFG="HelloMsg - Win32 Release"
然後您可通过输入:

DEBUG\HELLOMSG
或者

RELEASE\HELLOMSG
从命令列执行.EXE档案。

http://hi.baidu.com/jian_fei_yang/item/d4f4462ffd35900943634af8原文:

转载于:https://www.cnblogs.com/PursuitOnly/archive/2013/01/07/2849661.html

cmake,make,nmake的用法相关推荐

  1. 编译工具make、gmake、cmake、nmake和Dmake的区别

    1.  gamke, make, nmake, dmake, cmake 异同 现有编译工具 ----------------- gmake是GNU Make的缩写.       Linux系统环境下 ...

  2. gcc/g++/makefile/easymake/cmake/xmake/nmake ...

    最简单的Makefile,但是还是大程序少不了makefile工具 #CC=arm-linux-gnueabihf- CC= target:     $(CC)gcc -o algo_main alg ...

  3. CMake中include指令用法介绍

    转载于:  https://blog.csdn.net/liitdar/article/details/81144461 本文主要介绍CMake中include指令的用法. 1 概述 引用CMake官 ...

  4. windows平台下用CMake工具编译osg用法说明

    最近研究osg,用CMake工具将osg源码转为VS下的工程.解决方案,开始时不懂,走了很多弯路,现在将自己理解的记录如下: 1):在CMake图形界面中的"Where is the sou ...

  5. cmake中add_definitions的用法

    add_definitions的功能和C/C++中的#define是一样的 比如我有如下两个文件,一个源文件main.cpp,一个CMakeLists.txt 源文件main.cpp #include ...

  6. CMake入门1——CMake与VS编译器和nmake的结合使用

    下载 安装 例1 使用cmake-gui与VS生成器 例3 PreLoadcmake用法 本文描述在Win10-64位系统中安装CMake.cmake-gui的简单使用及其与VS2015编译器的结合使 ...

  7. nmake工具的用法

    [源] = [<Windows 环境下32位汇编语言程序设计(第2版)>] 2.4 make工具的用法 2.4.1 make工具是什么     在DOS时期编写汇编程序的时候,编译器和链接 ...

  8. Cmake的基础知识

    转载自:https://blog.gmem.cc/cmake-study-note 这个周末希望能把他看掉. 基础知识 CMake简介 CMake是一个开源的可扩展工具,用于独立于编译器的管理构建过程 ...

  9. c语言make编译器,cmake 指定编译器

    vs2015 x64编译器为例,cmake命令如下: Xml代码  收藏代码 cmake -G "Visual Studio 14 Win64" path\to\source\di ...

最新文章

  1. 160个Crackme040
  2. 锻炼能降低13种癌症风险
  3. android学习笔记(入门篇)
  4. apache.camel_Apache Camel 2.11发布
  5. xp计算机属性打不开,xp系统我的电脑右键属性打不开怎么办
  6. python连接redis失败、积极拒绝_python-django-redis拒绝连接问题解决_20191121
  7. org.apache.struts.chain.commands.InvalidPathException: No action config found for the specified url.
  8. javaScript中获取时间
  9. 有谁还记得“开源”已经20年了!
  10. 常见音视频编码格式一览
  11. 定量论文:探究「健康水平、婚姻状况」对幸福感的影响
  12. android SDK 开发心得笔记
  13. thinkphp 中英文语言包
  14. PHP微信多级三级分佣系统,微信三级分销系统微信三级分销系统
  15. 计算机操作系统(第四版)课后习题答案西电版
  16. Mac录屏无声音?5分钟解决|mac录屏收音APP-Loopback for Mac使用方法
  17. 最新超详细VMware虚拟机下载与安装(一篇足以带你上高速,附钥)
  18. Apache APISIX 社区成员助力 openEuler 发布第一个社区创新版
  19. 客户画像分析用于贷中监控的案例
  20. Spring框架下载最新地址

热门文章

  1. 柏林的评委还识货,我的打赌也算是赢了
  2. 《誓鸟》是什么小说?
  3. win10 x64+anaconda+labelme标注数据
  4. 编码gbk的不可映射字符_Python基础:编码表和字符的故事
  5. mysql第四章分页显示查询出租房屋信息_MYSQL必知必会读书笔记第四章之检索数据...
  6. 禅道项目管理_禅道 11.6.1 版本发布,完善细节,修复 Bug
  7. php ziparchive(),php的ZipArchive类用法实例
  8. pythonweb啥意思_python-web-guide
  9. clickhouse hadoop_大数据分析之解决Hadoop的短板,实时大数据分析引擎ClickHouse解析...
  10. 【TensorFlow-windows】MobileNet理论概览与实现