于是开始找跨平台的编译工具,其中最有名的两个是 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档案。
分享到:
相关推荐
CMake 用法详解,简单描述了CMake 的使用方法,通过简单的例子
Nmake_Make.zip
学习Makefile的编写,希望能用得上,make是非常好用的自动化工具
gcc make makefile cmake cmakelist 区别 gcc make makefile cmake cmakelist 区别
CMake实践是大神总结的CMake的使用用法,涵盖了CMake的所有使用方式,本人更是进一步添加了书签,是你能够快速定位到你需要的知识,本PDF为高清版+书签,学习CMake的同学可以下载。 PS:非常好的学习资料,我看完...
小白刚入门cmake,通过这个文档可以对cmake有一定理解和认识,适用新手
安装需要的mysql安装包以及Cmake安装包,其中包含安装Cmake以及mysql的安装文档,文档中包含对安装过程中的异常处理
大型项目组件配置案例,参考Poco实现,如有不当之处请多多批评指正。环境ubuntu16.04,cmake版本3.5.1,其中test_cmake工程为案例,test_cmake_find用来依赖test_...然后make最后./test_cmake_find可看到打印结果。
cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 cmake教程 ...
Auto-detects the actual build tool to invoke: make, ninja, nmake, MinGW make, MSYS make, ... Provides a Language Settings Provider that can feed include paths and pre-processor symbols from cmake ...
自己下载好的CMake3.16安装包,具体安装教程可前往CSDN博客“Win10-64位(或Win7)+VS2019+ITK4.13.2+VTK8.2+CMake3.16环境配置”中查看
CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目
cmake菜谱中文版, cmake practice 很好的cmake入门资料
按照cmake的编写代码习惯即可,cmake会自动生成对应的Makefile文件. 1.在json文件中根据需求调整设置; 2.设置后,在vscode左下角选择工具链类型; 3.点击cmake的build工具图标,生成.ko文件; 4.清理l临时文件,在源码目录...
VS code配置步骤先按照网上的方法完成,大概就是安装mingw,cmake,VS code,然后安装VS code中的插件: 安装好之后,新建文件夹/项目如下: 其中,build是打开文件夹以后自动生成的。test中是源文件还有项目文件等...
CMake Practice 学习cmake经典指南 CMake Practice 学习cmake经典指南 CMake Practice 学习cmake经典指南
Cmake交叉编译环境配置文档 1、设置交叉编译之前,必须在CMakeList.txt前面加上这样一句,这样CMake才会认为你是要交叉编译: SET(CMAKE_SYSTEM_NAME Linux) 其中Linux是要编译过去的平台,如果你是在Linux下交叉...
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性
dpkg 无网安装cmake
这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。 CMake 可以编译源代码、制作程式库、产生适配器...