如何使用CMAKE生成makefile文件

1,编译  http://www.cmake.org/cmake/resources/software.html 去下载源代码和生成好的exe文件,我用的是  Windows Source (has \r\n line feeds) cmake-2.8.3.zip  Windows (Win32 Install...

 

  1,编译
  http://www.cmake.org/cmake/resources/software.html 去下载源代码和生成好的exe文件,我用的是
  Windows Source (has \r\n line feeds) cmake-2.8.3.zip
  Windows (Win32 Installer) cmake-2.8.3-win32-x86.exe
  Windows ZIP cmake-2.8.3-win32-x86.zip
  
  windows编译
  
  方法1用MSYS/MingW
  ./bootstrap
  make
  make install
  
  方法2自己编译自己
  安装cmake,然后
  cmake . 记住中间还有个空格
  make
  make install
  
  最好安装,因为还要设置环境变量,这些活让系统来好了,其实就是在path环境变量中加入cmake的执行路径而已,勤快的话,也可不用安装
  
  编译boost
  下面我使用另外一种方法来编译boost ,在linux下用cmake来生成Makefile,然后在编译安装,其实我们在windows下也可以使用cmake来编译安装。 cmake是一个跨平台的一个类似于qmake 的生成Makefile的东东:)。
  
  
  
  首先:现在cmake ,现在已经有了2.8版本了。然后就点击安装,记得要选用环境变量。
  
  第2:就下载boost1.40 库了,把它解压到一个目录,如我解压到C:\boost-1.40.0.cmake2。
  
  里面必须有CMakeLists.txt文件,没有的话换个版本
  
  第3:进入控制台环境,然后变换到C:\boost-1.40.0.cmake2目录里,执行cmake .。记得后面有一个"."代表当前目录。之后会生成一个Boost.sln项目,我的是vc9。
  
  第4:点击Boost.sln,然后右键点击ALL_BUILD项目,选择build,然后编译,我事先选择 的是release版本,然后就等着编译完成吧(91个项目都编译成功)。
  
  第5:右键点击INSTALL项目,选择build。最后会安装到C:\Program Files\Boost目录下。里面会有三个目录bin,include和lib。
  
  亲自测试成功
  
  ///
  
  CMake与跨平台编译
  2009-04-06 06:24
  本篇推荐一个跨平台(cross-plateform)的Make工具 - CMake.
  
  CMake 的官方下载地址: http://www.cmake.org/cmake/resources/software.html
  
  中文介绍: http://www.qtchina.net/cmake-cn/About.html
  
  CMake 中文一个使用教程: http://techbase.kde.org/Development/Tutorials/CMake_(zh_CN)
  
  一篇不错的CMake介绍: http://blog.csdn.net/Bowater/archive/2008/05/18/2456732.aspx
  
  我们先去官方网站下载CMake的windows版本。提供源代码和编译好的版本,还有安装版本。
  
  为了方便,我们可以下载安装版,这样可以省去配置环境变量的过程。目前最新版本2.6.3
  
  安装版: http://www.cmake.org/files/v2.6/cmake-2.6.3-win32-x86.exe
  
  编译版: http://www.cmake.org/files/v2.6/cmake-2.6.3-win32-x86.zip
  
  源码版: http://www.cmake.org/files/v2.6/cmake-2.6.3.zip
  
  上面三个都是windows的最新版。
  
  (PS: cygwin下也有cmake,可以直接安装使用)
  
  CMake的安装
  
  Windows上安装很简单,安装版的话一路next就好。编译版的话,解压后添加bin目录到环境目录即可。
  
  CMake的使用
  
  CMake支持跨平台的Makefile制作。支持多种编译工具,IDE等的工程项目。
  
  如: windows上的VC6, VC7, VC8, VC9的工程项目创建。可以制作多种格式的Makefile如
  
  nmake Makefile, MinGW Makefile,Code::Blocks Makefile,Eclipse Makefile, Unix Makefile ect.
  
  也就是说,只要按CMake制作了工程,就可以编译成多种平台上的编译文件,可谓非常之方便。
  
  让我们看一个制作的实例。源码版里有一个Example文件夹,我们就用这个例子。
  
  首先打开Example文件夹,熟悉一下这个工程里的文件结构。
  
  里面有两个文件夹Demo和Hello。
  
  Hello里是一个项目,编译生成一个lib库,里面定义了一个类函数。
  
  Demo里是另一个项目,调用这个lib库的函数。
  
  注意每个文件夹里都有一个CMakeLists.txt文件。这个文件很重要,就是CMake用来了解项目结构用的文件。关于这个文件的编写格式和 语法也比较简单,可以参考软件的说明档。
  
  我们直接测试一下看看。
  
  调用CMake可以有两种模式,一种是命令行模式,另一种是GUI模式。
  
  cmake.exe就调用命令行。
  
  cmake-gui.exe 就是GUI模式程序。
  
  我们运行GUI. 填入如下信息:
  
  where is source code: 就是填入我们的源代码位置。我们选择Example这个文件夹。
  
  where is build binaries: 就是编译后文件的输出地址。也包括生成的Makefile和工程文件的输出地址。自己随便指定一个位置。
  
  其他的都可以使用默认设定。
  
  按configure进行配置, 弹出对话框选择生成项目或makefile类型。
  
  我们先测试一下VC6工程吧,选择VC6,然后确定 ( 注意,你电脑里必须安装了VC6,且环境变量里有VC6的相关路径。只要VC6正常安装了,这些都有。)
  
  确定后,程序会自动检测VC6并生成CMake的配置信息。
  
  接着,我们点击generate就可以生成VC6的工程文件了。
  
  现在,我们到指定的 build binaries文件夹里,里面就有VC6的工程文件HELLO.dsw
  
  大家可以试试打开他,编译程序,生成HELLO.lib和helloDemo.exe
  
  现在,我们试试其他的工程格式。
  
  build binaries选择另一个地址。File - Delete cache 删除原来的设置。
  
  按configure 开始一个新的配置,选VC9项目。然后默认确定。只要装了VC9(即VS2008)就会配置成功。
  
  再按generate就生成了VC9的工程文件。
  
  进入build binaries文件夹就会看到HELLO.sln 这个生成的VC9版工程文件。
  
  大家可以用VC9打开,编译一下看看。
  
  再介绍一下Makefile的形式。我们先试试NMake Makefile。这时VC模式下的Makefile
  
  操作步骤和前面差不多。按configure选择项目类型时,选NMake makefile. 然后generate生成Makefile工程.
  
  打开工程目录里就有一个Makefile文件,cmd下输入nmake就可以编译项目了。
  
  我们也可以试试Unix Makefile。 configure时选Unix Makefile,然后generate.
  
  拿到Unix下Make就行了。我们可以试试在cygwin下make,也很顺利。
  
  ///
  网上资料
  CMake使用总结(1)
  前言
  做第一个linux项目时,Makefile是一行行敲入的,第二个项目后,开始使用cmake。至于为何选择cmake,倒不是觉得它有什么好,仅仅是因为当时项目组中的一个linux前辈向我们推荐了这个。经过一番研究之后,并在项目中使用,现将使用经验总结一下,供大家参考。
  入门篇
  
  学习一项新知识的时候,最好是从sample开始。cmake官方网站就给出了一个简单的例子。在开始之前,还是先安装cmake程序,在ubuntu下非常简单,输入以下命令即可:
  
  $sudo apt-get install cmake
  
  下面来看看sample中的内容。sample包含一个主目录,下面两个子目录: Demo和Hello。其中Hello包含程序库代码,Demo中为可执行程序,需要连接Hello中的程序库。总共有三个CMakeLists.txt 文件,每个目录下一个。主目录下的CMakeLists.txt文件内容为:
  
  # The name of our project is "HELLO". CMakeLists files in this project can
  # refer to the root source directory of the project as ${HELLO_SOURCE_DIR} and
  # to the root binary directory of the project as ${HELLO_BINARY_DIR}.
  project (HELLO)
  # Recurse into the "Hello" and "Demo" subdirectories. This does not actually
  # cause another cmake executable to run. The same process will walk through
  # the project's entire directory structure.
  add_subdirectory (Hello)
  add_subdirectory (Demo)
  
  
  Hello目录下的CMakeLists.txt文件为:
  
  # Create a library called "Hello" which includes the source file "hello.cxx".
  # The extension is already found. Any number of sources could be listed here.
  add_library (Hello hello.cxx)
  
  
  最后,Demo包含如下CMakeLists.txt文件:
  
  # Make sure the compiler can find include files from our Hello library.
  include_directories (${HELLO_SOURCE_DIR}/Hello)
  # Make sure the linker can find the Hello library once it is built.
  link_directories (${HELLO_BINARY_DIR}/Hello)
  # Add executable called "helloDemo" that is built from the source files
  # "demo.cxx" and "demo_b.cxx". The extensions are automatically found.
  add_executable (helloDemo demo.cxx demo_b.cxx)
  # Link the executable to the Hello library.
  target_link_libraries (helloDemo Hello)
  
  
  CMake在主目录执行时,会处理该目录下CMakeLists.txt文件,然后进入到子目录,处理子目录下的CMakeLists.txt.
  
  从字面上看,我们差不多可以理解这三个文件的涵义。第一个CMakeLists.txt文件指定包含Hello和Demo两个子目录。第二个文件则指定生成Hello库文件,第三个文件则是生成一个可执行文件helloDemo,另外两个附加语句则用来指明头文件路径以及所要链接的库。
  
  乍一看,为了编译一个程序,需要写三个CMakeLists.txt文件,相对于原来只需写一个Makefile文件,不是更复杂了吗?事实上不尽然,虽然要写三个CMakeLists文件,但每个文件都非常简单,总共算起来,并不比一个Makefile文件多多少。更重要的是,这其中隐含着 linux哲学:分而治之。每个模块自行编写配置文件,只负责自己份内的事务,所以可扩展性好。在进行大型项目开发,就可以体现出优势了。
  
  CMakeLists.txt相当于定义了一套生成Makefile文件的规则,下面就可以生成Makefile文件了,命令如下:
  
  $cmake .
  
  注:.表示当前目录,如果CMakeLists.txt不在当前目录,请在cmake后面指定。在主目录下和Demo、Hello子目录下均会生成一个Makefile文件,有了这个文件,我们就可以敲入make编译目标程序了。
  
  总结起来,使用CMake编译应用程序的流程为:
  CMake语法介绍
  
  CMake语法非常简单,包含注释、命令和空格。以#开头的行为注释行,命令则由命令名、括号及以空格进行分隔的参数组成。命令可以是诸如 add_library这样的内置命令,也可以是子定义的宏或者函数。CMake的输入是主目录下的CMakeLists.txt文件,该文件可以使用 include或者add_directory命令添加其它的输入文件。
  命令
  
  命令的形式如下:
  
  command (args ...)
  
  其中<I>command</I>为命令名,<B>args</B>为空格分隔的参数列表,如果参数中包含空格,使用双引号引起来。命令不区分大小写。
  
  lists and strings. CMake的基本数据类型为字符串,字符串又可以组成list类型,有两种方式:一种通过分号分隔,一种通过空格分隔。比如以下例子给VAR赋了同样的值:
  
  set(VAR a;b;c) set(VAR a b c)
  
  
  字符串列表主要用于foreach进行迭代,有些命令也用于对list进行处理。
  
  CMake支持字符串和list类型的简单变量,变量以${VAR}形式引用。多个参数可以用set命令组成一个list,命令将展开list,例如:
  
  set(Foo a b c)
  command(${Foo})
  
  等价于
  
  command(a b c)
  
  如果你希望将list当作一个参数传递给命令,就应该用双引号把list引起来,如command("${Foo}")等价于command("a b c")
  流程控制
  
  写CMakeLists.txt文件就象写一个简单的程序,CMake提供了三种流程控制结构:
  
  * 条件语句if
  
  # some_command will be called if the variable's value is not:
  # empty, 0, N, NO, OFF, FALSE, NOTFOUND, or -NOTFOUND.
  if(var)
  some_command(...)
  endif(var)
  
  * 循环结构
  
  set(VAR a b c)
  # loop over a, b,c with the variable f
  foreach(f ${VAR})
  some_command(${f})
  endforeach(f)
  
  
  * 宏和函数,函数在2.6及以上版本才支持,函数和宏的区别在于函数中可定义局部变量,而宏定义的变量都是全局变量。
  
  # define a macro hello
  macro(hello MESSAGE)
  message(${MESSAGE})
  endmacro(hello)
  # call the macro with the string "hello world"
  hello("hello world")
  
  # define a function hello
  function(hello MESSAGE)
  message(${MESSAGE})
  endfunction(hello)
  
  
  小结
  本文通过一个简单的工程示例,我们了解到要让CMake工作起来,需要编写CMakeLists.txt文件,CMake据此生成Makefile。然后简单的过了以下CMake的语法,有了这个基础,我们就可以自行编写CMakeLists.txt文件了。当然,对于一个大型的工程,仅仅掌握这些还不够,需要进一步掌握一些CMakeLists.txt文件的编写技巧,将在后续的文件中继续这个话题。
  CMake使用总结(2)
  项目文件组织
  
  一个项目,通常包含若干子模块。比如上一篇的sample,我们可以认为它包含两个子模块,Hello为程序库,Demo为主程序。很少有项目会把 目标二进制文件和源程序放在一起的,通常会建立一个bin目录,存放生成的二进制文件,发布程序则放在release。根据我在项目开发中的习惯,将目录 结构修改如下:
  
  
  CMakeSample
  |--- release
  |--- doc
  |--- lib
  |--- source
  |--- include
  |--- bin
  |--- Hello
  |--- Demo
  其中,release存放程序发布相关文件,包括程序文件、脚本、参数等。doc包含项目开发中的相关文档,如设计说明以及通过doxgen等工具 从代码中生成的文档。lib存放项目中使用的第三方库,项目中自己编写的库不放在此目录,应该作为项目的一个模块放在source目录下。include 包含整个项目中使用的公共头文件,如果子模块中的头文件仅在该子模块类使用,不需放到include目录。bin目录存放编译后的调试版本代码。其它的子 目录则为各模块的代码及头文件。
  
  按照以上目录结构,将Hello下的hello.h移到include目录,因为这个头文件被Demo模块包含。这个sample中未使用第三方 库,所以暂时为空。
  
  常用的几个内置变量
  
  从上文中我们知道,通过set语句可以自定义变量,然而,CMake还包含大量的内置变量,这些变量和自定义变量的用法没有区别,下面就列出一些常 用的变量:
  
  CMAKE_C_COMPILER
  指定C编译器,通常,CMake运行时能够自动检测C语言编译器。进行嵌入式系统开发时,通常需要设置此变量,指定交叉编译器。
  
  CMAKE_CXX_COMPILER
  指定C++编译器
  
  CMAKE_C_FLAGS
  指定编译C文件时编译选项,比如-g指定产生调试信息。也可以通过add_definitions命令添加编译选项。
  
  EXECUTABLE_OUTPUT_PATH
  指定可执行文件存放的路径。
  
  LIBRARY_OUTPUT_PATH
  指定库文件放置的路径
  
  常用的命令
  
  除了内置变量,我们还可以通过命令来修改编译选项,现将一些常用的命令列出来:
  
  include_directories
  指定头文件的搜索路径,相当于指定gcc编译器的-I参数
  
  link_directories
  动态链接库或静态链接库的搜索路径,相当于指>定gcc的-L参数
  
  add_subdirectory
  包含子目录,当工程包含多个子目录时,此命令有用
  
  add_definitions
  添加编译参数,比如add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义
  
  add_executable
  编译可执行程序
  
  target_link_libraries
  指定链接库,相同于指定-l参数
  
  小结
  
  本 文经过修改目录结构,指定编译工具链,生成动态链接库等动作,将前文的sample修改成一个比较接近实际工程的嵌入式环境。当然这个sample仍然只 是一个自娱自乐的小玩意,但对于说明CMake用法已经足够了,有了这些基本的CMake知识,在项目中使用CMake就成为可能了。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值