`
javatgo
  • 浏览: 1179134 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

cmake,make,nmake的用法

阅读更多

于是开始找跨平台的编译工具,其中最有名的两个是 cmakescons ,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 Practice.pdf

    - **Linux/Unix**:生成Makefile文件,以便使用传统的make命令进行构建。 - **Mac OS X**:生成Xcode项目文件,便于在苹果平台上进行集成开发。 - **Windows**:生成Visual Studio解决方案文件或NMake文件,方便...

    cmake-3.5.2

    CMake的使用方法: 1. **安装CMake**:首先,你需要在你的操作系统上安装CMake。这可以通过下载官方提供的安装程序或通过包管理器(如在Linux中的apt-get或Ubuntu的apt,在macOS上的Homebrew,在Windows上的...

    CMake经典入门例子

    CMake是一种跨平台的自动化构建系统,它使用CMakeLists.txt文件来控制软件的编译过程。CMake可以生成本地IDE的工程文件...通过实践这些例子,用户可以掌握CMake的基本用法,并为进一步学习和使用CMake打下坚实的基础。

    cmake-3.16.9-win32-x86.zip

    CMake的使用方法包括命令行、图形化界面和源码级集成(如在IDE中直接配置)。学习CMake需要理解其基本语法,如`add_executable`、`add_library`、`target_link_libraries`等命令,以及如何设置变量、条件语句和函数...

    cmake-3.16.2-win32-x86.zip

    2. `doc` 目录:可能包含CMake的文档,帮助用户了解CMake的使用方法和API。 3. `share` 目录:可能包含CMake模块、脚本和其他资源,这些资源用于扩展CMake的功能。 4. `lib` 目录:可能包含CMake运行所需的动态链接...

    IrrlichtCMake:Irrlicht CMake构建系统

    您只需要指定要使用的make系统(gnu make,nmake,ninja mingw-makefile,msys-makefiles)或您使用的IDE(Eclipse项目文件,Visual Studio项目文件),CMake便会生成所有必需的文件。该文件。 与单个Makefile和...

    CMake简介及CMakeLists的语法和简单示例

    编译器如gcc、g++、cl.exe、clang等负责将源代码转换为目标文件,而构建工具如Make、Ninja、Nmake、Xcode和VS的项目文件则用于协调这些步骤,通过脚本语言定义编译规则。 CMake 的工作原理是,首先通过cmake命令...

    cmake 学习笔记(一) - 1+1=10 - 博客频道 - CSDN1

    在本文中,我们将逐步学习如何使用CMake构建简单的C程序,并逐渐增加复杂性,从而更好地理解CMake的工作原理和使用方法。 **例子一:单个源文件** 首先,我们有一个简单的C程序`main.c`: ```c #include int ...

    笔记:Qt 6.2.2编译QtPropertyBrowser 附源码

    接着,使用`make`或`nmake`(取决于你的编译环境)来编译源码。编译过程可能会生成`buildlib`目录,这是存放编译结果的地方。 5. **安装和集成** 编译成功后,通常会有一个`INSTALL.TXT`和`README.TXT`文件,它们...

    FFMPEG编译工具-Git-2.29.2-64-bit|Git-2.29.2-64-bit.rar

    - **构建**:使用`make`命令(MinGW环境)或`nmake`(Visual Studio环境)进行编译,生成静态库或动态库以及可执行文件。 - **安装**:编译完成后,使用`make install`将FFmpeg安装到指定目录,通常为`/usr/local`...

    OpenSSL3.2动态库

    4. 编译和链接:执行“make”或“nmake”命令以开始编译过程。这将生成所需的动态库文件(如libssl.lib和libcrypto.lib)以及对应的dll文件(如libssl.dll和libcrypto.dll)。 5. 验证和测试:编译完成后,使用提供...

    mplayer-export-snapshot.rar_mplayer

    - **学习文档**:查阅MPlayer的官方文档,了解其API接口和使用方法,以便进行二次开发。 - **社区参与**:加入MPlayer的开发者社区,与其他开发者交流,获取最新的开发资讯和解决问题的策略。 - **性能优化**:研究...

    log4cxx dll .lib .a .so 編譯 linux windows

    - 使用nmake或MSBuild编译生成.log4cxx.lib和.log4cxx.dll。 三、Linux平台编译 在Linux系统下,log4cxx通常生成.a静态库和.so动态库。静态库(.a)在编译时链接到目标程序,而动态库(.so)在运行时加载。 1. 编译...

Global site tag (gtag.js) - Google Analytics