• CMake使用教程


     
    CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。
    通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者ctest)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。
    如果有嵌套目录,子目录下可以有自己的CMakeLists.txt。
    总之,CMake是一个非常强大的编译自动配置工具,支持各种平台,KDE也是用它编译的,感兴趣的可以试用一下。
     
    VTK)的过程中所产生的衍生品。后来经过发展,最终形成体系,在2001年成为一个独立的开放源代码项目。其*****是www.cmake.org,可以通过访问*****来获得更多关于cmake的信息,而且目前官方的英文文档比以前有了很大的改进,可以作为实践中的参考手册。

      cmake的流行离不开KDE4的选择。KDE开发者在使用autotools近10年之后,终于决定为KDE4项目选择一个新的工程构建工具。之所以如此,用KDE开发者们自己话来说,就是:只有少数几个“编译专家”能够掌握KDE现在的构建体系。在经历了unsermake,scons以及cmake的选型和尝试之后,KDE4最终决定使用cmake作为自己的构建系统。在迁移过程中,进展一场的顺利,并获得了cmake开发者的支持。所以,目前的KDE4开发版本已经完全使用cmake来进行构建。

      随着cmake 在KDE4项目中的成功,越来越多的项目正在使用cmake作为其构建工具,这也使得cmake正在成为一个主流的构建体系。

      一、为何要使用项目构建工具?

      为何要使用cmake和autotools之类的项目构建工具? 我想,这恐怕是刚刚接触软件项目的人最应该问的问题之一了。

      “Hello, world!“这个最经典的程序相信我们每个人都写过。无论在什么平台下,编译和运行这个程序都仅需要非常简单的操作。但事实上,hello,world最多只能算是一个实例程序,根本算不上一个真正的软件项目。

      任何一个软件项目,除了写代码之外,还有一个更为重要的任务,就是如何组织和管理这些代码,使项目代码层次结构清晰易读,这对以后的维护工作大有裨益。使想一下,如果把一个像KDE4那么大的项目像hello world那样,把全部代码都放到一个main.cpp文件中,那将会是多么恐怖的一件事情。别说KDE4,就是我们随便一个几千行代码的小项目,也不会有人干这种蠢事。

      决定代码的组织方式及其编译方式,也是程序设计的一部分。因此,我们需要cmake和autotools这样的工具来帮助我们构建并维护项目代码。

      看到这里,也许你会想到makefile,makefile不就是管理代码自动化编译的工具吗?为什么还要用别的构建工具?

      其实,cmake和autotools正是makefile的上层工具,它们的目的正是为了产生可移植的makefile,并简化自己动手写makefile时的巨大工作量。如果你自己动手写过makefile,你会发现,makefile通常依赖于你当前的编译平台,而且编写makefile的工作量比较大,解决依赖关系时也容易出错。因此,对于大多数项目,应当考虑使用更自动化一些的cmake或者autotools来生成makefile,而不是上来就动手编写。

      总之,项目构建工具能够帮我们在不同平台上更好地组织和管理我们的代码及其编译过程,这是我们使用它的主要原因。

      二、cmake的主要特点:

      cmake和autotools是不同的项目管理工具,有各自的特点和用户群。存在即为合理,因此我们不会对两者进行优劣比较,这里只给出cmake的一些主要特点:

      1.开放源代码,使用类 BSD 许可发布。

      2.跨平台,并可生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile,在 苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。

      3.能够管理大型项目,KDE4 就是最好的证明。

      4.简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。

      5.高效率,按照 KDE 官方说法,CMake 构建 KDE4 的 kdelibs 要比使用 autotools 来 构建 KDE3.5.6 的 kdelibs 快 40%,主要是因为 Cmake 在工具链中没有 li^ool。

      6.可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。

      三、安装cmake

      安装cmake 对任何用户而言都不该再成为一个问题。几乎所有主流的Linux发行版的源中都包含有cmake的安装包,直接从源中添加即可。当然,也可以在*****下载源代码自行编译安装。

      对于Windows和Mac用户,cmake的*****上有相应的安装包,下载安装即可,无须赘述。

      注:为了能够测试本文中的实例程序,如果读者的Linux系统中所带的cmake版本低于2.6,请从官网下载2.6版本或以上的源代码进行编译并安装。

      在linux下安装cmake

      首先下载源码包

      http://www.cmake.org/cmake/resources/software.html

        Unix/Linux用户下载cmake-2.*.tar.gz

        Windows用户的下载文件有3种,可任选一种:

         (1)Windows Source (has line feeds)    cmake-2.8.4.zip CMake的源码文件里面含有测试实例

         (2)Windows (Win32 Installer)    cmake-2.8.4-win32-x86.exe CMake的安装文件,直接安装即可

         (3)Windows ZIP    cmake-2.8.4-win32-x86.zip CMake的绿色版软件,免安装。


      随便找个目录解压缩

      tar -xzvf cmake-2.*.tar.gz

      cd cmake-2.*

      依次执行:

      ./bootstrap

      make

      make install

      cmake 会默认安装在 /usr/local/bin 下面

      四、从“Hello, world!”开始

      了解cmake的基本原理并在系统中安好cmake后,我们就可以用cmake来演示那个最经典的”Hello, world!”了。

      第一步,我们给这个项目起个名字——就叫HELLO吧。因此,第一部为项目代码建立目录hello,与此项目有关的所有代码和文档都位于此目录下。

      第二步,在hello目录下建立一个main.c文件,其代码如下:

      #include

      int main(void)

      {

      printf(”Hello,World ”);

      return 0;

      }

      第三步,在hello目录下建立一个新的文件CMakeLists.txt,它就是cmake所处理的“代码“。其实,使用cmake管理项目本身也是在编程,所以称之为“代码(或脚本)”并不为过。在CMakeLists.txt文件中输入下面的代码(#后面的内容为代码行注释):       

      CMAKE_MINIMUM_REQUIRED(VERSION 2.6) #cmake最低版本需求,不加入此行会受到警告信息

      PROJECT(HELLO) #项目名称  

      AUX_SOURCE_DIRECTORY(. SRC_LIST) #把当前目录(.)下所有源代码文件和头文件加入变量SRC_LIST

      ADD_EXECUTABLE(hello ${SRC_LIST}) #生成应用程序 hello (在windows下会自动生成hello.exe)

      至此,整个hello项目就已经构建完毕,可以进行编译了。

      第四步,编译项目。

      为了使用外部编译方式编译项目,需要先在目录hello下新建一个目录build(也可以是其他任何目录名)。现在,项目整体的目录结构为:

      hello/

      |– CMakeLists.txt

      |– build /

      `– main.c

      在windows下,cmake提供了图形界面,设定hello为source目录,build为二进制目录,然后点击configure即可开始构建。编译可以在VC++2008下进行,具体见后面的详述。


      在linux命令行下,首先进入目录build,然后运行命令(注:后面的“..”不可缺少):

      cmake ..

      该命令使cmake检测编译环境,并生成相应的makefile。接着,运行命令make进行编译。编译后,生成的所有中间文件和可执行文件会在build目录下。 下面是我在ubuntu上的运行过程:

      $ ls

      hello

      $ cd hello/build/

      $ ls

      $ cmake ..

      – The C compiler identification is GNU

      – The CXX compiler identification is GNU

      – Check for working C compiler: /usr/bin/gcc

      – Check for working C compiler: /usr/bin/gcc — works

      – Detecting C compiler ABI info

      – Detecting C compiler ABI info - done

      – Check for working CXX compiler: /usr/bin/c++

      – Check for working CXX compiler: /usr/bin/c++ — works

      – Detecting CXX compiler ABI info

      – Detecting CXX compiler ABI info - done

      – Configuring done

      – Generating done

      – Build files have been written to: /home/kermit/Project/cmake/hello/build

      $ make

      Scanning dependencies of target hello

      [100%] Building C object CMakeFiles/hello.dir/main.c.o

      Linking C executable hello

      [100%] Built target hello

      $ ls

      CMakeCache.txt CMakeFiles cmake_install.cmake hello Makefile

      $ ./hello

      Hello,World

      上面,我们提到了一个名词,叫外部编译方式。其实,cmake还可以直接在当前目录进行编译,无须建立build目录。但是,这种做法会将所有生成的中间文件和源代码混在一起,而且cmake生成的makefile无法跟踪所有的中间文件,即无法使用”make distclean”命令将所有的中间文件删除。因此,我们推荐建立build目录进行编译,所有的中间文件都会生成在build目录下,需要删除时直接清空该目录即可。这就是所谓的外部编译方式。

    下面主要介绍在Windows平台下CMake的编译和最常用的三个命令,分别是cmake_minimum_required; project; add_executable等。 

    CMake是个好东西,在使用VTK, ITK, IGSTK, OpenCV, DCMTK等开源工具包时,是离不开CMake的,甚至有时你使用 FLTK , Qt等界面开发工具时,也经常会看到CMake,你会发现在好多目录下会有一个文件”CMakeLists.txt”,这个文件就是使用CMake构建工程环境的重要文件。了解一点关于CMake的内容,对使用以上提到的一些开源工具包是灰常有帮助的,而且你会发现,CMake用久了,你会觉得它是很可爱很好用的东西。

    废话少说,结合我个人在使用CMake的过程中,把CMake的一些知识梳理一下,希望对大家有所帮助,如果有不对的地方,请你留言或者发邮件告诉我(水灵,msn: shuiling119@hotmail.com,QQ: 348774226)。

    如果你检索到了我关于CMake的这些文章时,我是假定你已经对CMake的作用有所了解。下面我们从最简单的入手来看看CMake怎么使用:写一个HelloCMake.cpp文件,里面就简单地输出一行字符串:”Study CMake Together - Hello CMake!”,一起看看怎么用CMake来构建工程。

    首先,在使用CMake之前请先从CMake网站(http://www.cmake.org)上下载最新版的安装文件并在你的机子上安装,你也可以下载CMake源码,然后在你机子上编译;对于使用CMake的童鞋,建议用傻瓜式安装方式就行了(这里所做的例子全是在Windows 7平台上的。)

    然后,还要确保你的机子已经安装了一种编译器,我机子上安装的是VS2008。你也可以选择其他编译器,建议用VS2008或以上版本的,个人觉得比较好用。

    接着在你机子的某个盘里建一个新的文件夹,如我这里的完整路径是:D:CMakeCMake-StudyHelloCMake; 然后在HelloCMake文件夹里建立一个HelloCMake.cpp文件,里面的代码如下:

    #include <iostream>

    int main()

    {

    std::cout<<"Study CMake Together - Hello CMake!"<<std::endl;

    return 0;

    }

    然后在HelloCMake文件夹里建立一个CMakeLists.txt文件,注意文件名不能是别的,必须叫这个名字。里面的内容如下:

    cmake_minimum_required(VERSION 2.6)

    project(HelloCmake)

    add_executable(HelloCMake hellocmake.cpp)

    接着在HelloCMake的同级目录里建立一个新的文件夹,就叫做HelloCMake-bin,在我机子上的完整路径是:D:CMakeCMake-StudyHelloCMake-bin,你可以针对自己的目录路径对号入座。然后打开CMake程序,界面如图(1):
    CMake之初级教程

    图(1)  

    CMake之初级教程
    图(2)

    接着把包含CMakeLists.txt和HelloCMake.cpp文件的完整路径给”where is the source code”,把最后建立的HelloCMake-bin目录的完整路径给”where to build the binaries”,然后按Cofigure,界面如图(2)。

    Configure完了以后,选项可能为红色,重复按Configure命令,直到所有的红色选项都变成灰色为止,最后再按Generate命令。界面如图(3)。然后打开HelloCMake-bin,你会发现原来空的文件夹里面自动生成了好多文件,如图(4),图(4)中的文件有些是在最后编译完成后生成的。
    CMake之初级教程

    图(3)

    CMake之初级教程

    图(4)

    到此为止,工程构建完成,打开HelloCMake-bin目录下的HelloCMake.sln,里面有三个工程,分别是:ALL_BUILD;HelloCMake;ZERO_CHECK。这三个工程的大概作用如下(个人理解而已),HelloCMake就不用说了,自己要建立的那个工程;ALL_BUILD是管理整个项目的工程;ZERO_CHECK是实时监视CMakeLists.txt文件变化的工程,一旦CMakeLists.txt里的内容发生了任何变化,ZERO_CHECK就会告诉编译器要重新构建整个工程环境。所以,你可以先把工程关掉,打开CMakeLists.txt文件,更改里面的内容以后,把根据以上说的步骤走一遍CMake;你也可以在编译器环境(如VS2008)中更改CMakeLists.txt文件,然后直接F7编译工程。如果你选择后者,你会发现如图(5)所示的现象发生。

    因为你改变了CMakeLists.txt的内容,工程的环境要重新构建、设置。所以你必须加载新的工程环境设置。点Yes,然后点Reload。重新加载设置过的工程环境。

    另外一个经常看某些童鞋问的,就是当弹出图(6)所示的界面时要怎么办?能怎么办?界面上提示已经非常清楚了,指定exe的路径给它,然后点OK就可以了;出现这种情况的原因是你在CMakeLists.txt文件里没有添加了add_executable(HelloCMake hellocmake.cpp)命令;另外可能是你没有把生成exe可执行文件的工程设为启动工程了,如图(6)所示,你会发现ALL_BUILD这个工程名字是黑体显示的,表示它是启动工程;或者你把生成exe可执行文件的工程,如这里的HelloCMake右击->设置为启动工程,也不会出现如图(6)所示的界面。

    好,这些比较琐碎的东西介绍完,我们一起来看看CMakeLists.txt里面的代码表示什么意思,争取每句代码都作解释,如果有不对的地方,一定要告诉我!
    CMake之初级教程

    图(5)

    CMake之初级教程

    图(6)

    把CMakeLists.txt里的内容再罗列出来:

    1. cmake_minimum_required(VERSION 2.6)

    2. project(HelloCmake)

    3. add_executable(HelloCMake hellocmake.cpp)

    第1行,cmake_minimum_required(VERSION 2.6)这是对CMake版本的要求,基本上每个CMakeLists.txt文件里都会有这句代码,cmake_minimum_required是cmake里的命令,可大写小写。VERSION这个关键字必须是大写,而且不能省略;2.6就是CMake的版本号,现在的版本是2.8.3。

    第2行,project(HelloCmake),project也是CMake的命令,里面的参数HelloCMake是你要生成的工程的名字,换句话说就是生成的***.sln或者***.dsw等工程项目文件的名字。

    第3行,add_executable(HelloCMake hellocmake.cpp),add_executable同样是CMake的命令,链接有关的源文件,然后生成exe可执行文件,这是这个命令的作用。第一个参数是生成的exe文件的文件名,一般与project里的工程名一致,这样编译生成的文件就分别是HelloCMake.sln和HelloCMake.exe,当然也可以不一样。Add_executable()后面的是一个参数列表,可带多个要编译的文件名,中间以空格或回车等隔开,如可以加入:

    add_executable(HelloCMake hellocmake.cpp hellocmake.h)

     
    准备活动:
    (1)安装cmake。
    根据自己的需要下载相应的包即可,Windows下可以下载zip压缩的绿色版本,还可以下载源代码。
    (2)运行cmake的方法。(GUI、命令行)

    CMake使用步骤:
    运行GUI的cmake界面:
    cmake-2.8.1-win32-x86/bin/cmake-gui.exe

    执行Configure:
    运行之后,生成了如下文件:

    生成Makefile:
    执行Generate之后生成如下文件:
    运行make进行编译:
    编译完成后,在build目录生成Tutorial.exe,运行Tutorial.exe 25就可以看到运行结果:
    运行make install安装程序:
    运行make test进行测试:
     
    通过cmake tutorial学习CMake配置方法
    http://www.cmake.org/cmake/help/cmake_tutorial.html
    可以在源代码的Tests/Turorial目录中找到这个手册对应的代码。
    1、Step1。
    (如果不知道如何使用cmake,以及如何使用编译产生的Turorial.exe,可先看下前面“CMake使用步骤”的说明,它以Step4为例详细介绍了使用过程,Step1的配置可能不够完全,比如无法运行make install,无法运行make test,但可以参考。)
    简单的程序编译。
    (1)运行GUI的cmake,指定要编译的源代码路径和二进制文件路径(会自动创建)。
    (2)点击Configure,配置成功后,再点击Generate。
    配置需要选择合适的编译器,虽然我安装了VC2008,但没有配置成功;选择Unix Makefiles,配置成功,它自动找到了DevC++下的gcc.exe等编译器。
    (3)在build3目录执行make,就能够编译生成Turorial.exe了。
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step1/build3>make
    Linking CXX executable Tutorial.exe
    [100%] Built target Tutorial
    可以运行一下Turorial.exe:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step1/build3>Tutorial.exe
    Tutorial.exe Version 1.0
    Usage: Tutorial.exe number
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step1/build3>Tutorial.exe 4
    The square root of 4 is 2
    2、Step2
    把子目录编译为库,并且链接到最终的可执行文件。
    include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions") 
    add_subdirectory (MathFunctions) # 使得子目录MathFunctions也能被编译
     
    # add the executable
    add_executable (Tutorial tutorial.cxx)
    target_link_libraries (Tutorial MathFunctions)
    产生makefile:
    在GUI上点击Configure,之后Generate还是灰色,再次点击Configure,Generate就可以点击了。
    编译:
    在build目录运行make,即可开始编译,但是开始会报告sh.exe运行异常,应该是Tools下的UnxUtils的sh.exe与Win7不兼容,发现有如下make文件,估计是它导致的,于是把它重命名,不使用UnxUtils下的make,就OK乐。
    D:/Tools/CMD/UnxUtils/usr/local/wbin/make.exe
    编译过程:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step2/build>make
    [ 50%] Building CXX object MathFunctions/CMakeFiles/MathFunctions.dir/mysqrt.cxx
    .obj
    Linking CXX static library libMathFunctions.a
    [ 50%] Built target MathFunctions
    Linking CXX executable Tutorial.exe
    [100%] Built target Tutorial

    3、Step3
    支持make install把程序安装到系统指定目录,并且运行一些测试检查它是否能够正常工作。
    a、安装时使用的基础目录,由CMAKE_INSTALL_PREFIX指定。
    b、可以通过一个很简单的用例检查程序是否运行起来,没有出现异常。(TurotialRuns只是一个用例名字)
    add_test (TutorialRuns Tutorial 25)
    c、macro方式进行多组数据的测试是非常简洁方便的。
    #define a macro to simplify adding tests, then use it
    macro (do_test arg result)
    add_test (TutorialComp${arg} Tutorial ${arg})
    set_tests_properties (TutorialComp${arg}
    PROPERTIES PASS_REGULAR_EXPRESSION ${result})
    endmacro (do_test)
     
    # do a bunch of result based tests
    do_test (25 "25 is 5")
    do_test (-25 "-25 is 0")
    执行make install:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build>make install
    [ 50%] "Built target MathFunctions"
    [100%] "Built target Tutorial"
    Install the project...
    -- Install configuration: ""
    -- Installing: C:/Program Files/Tutorial/bin/Tutorial.exe
    -- Installing: C:/Program Files/Tutorial/include/TutorialConfig.h
    -- Installing: C:/Program Files/Tutorial/bin/libMathFunctions.a
    -- Installing: C:/Program Files/Tutorial/include/MathFunctions.h
    安装结果:
    C:/Program Files/Tutorial>tree /f
    C:.
    ├─bin
    │ libMathFunctions.a
    │ Tutorial.exe

    └─include
    MathFunctions.h
    TutorialConfig.h
    执行make test:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build>make test
    Running tests...
    Test project D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build
    Start 1: TutorialRuns
    1/5 Test #1: TutorialRuns ..................... Passed 0.01 sec
    Start 2: TutorialComp25
    2/5 Test #2: TutorialComp25 ................... Passed 0.01 sec
    Start 3: TutorialNegative
    3/5 Test #3: TutorialNegative ................. Passed 0.01 sec
    Start 4: TutorialSmall
    4/5 Test #4: TutorialSmall .................... Passed 0.00 sec
    Start 5: TutorialUsage
    5/5 Test #5: TutorialUsage .................... Passed 0.00 sec
     
    100% tests passed, 0 tests failed out of 5
     
    Total Test time (real) = 0.13 sec
    修改一个测试用例,让它不过:
    修改顶层CMakeLists.txt,然后重新Configure和Generate,然后make test即可看到结果。
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build>make test
    Running tests...
    Test project D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step3/build
    Start 1: TutorialRuns
    1/5 Test #1: TutorialRuns ..................... Passed 0.01 sec
    Start 2: TutorialComp25
    2/5 Test #2: TutorialComp25 ...................***Failed Required regular expre
    ssion not found.Regex=[25 is 3
    ] 0.01 sec
    Start 3: TutorialNegative
    3/5 Test #3: TutorialNegative ................. Passed 0.01 sec
    Start 4: TutorialSmall
    4/5 Test #4: TutorialSmall .................... Passed 0.01 sec
    Start 5: TutorialUsage
    5/5 Test #5: TutorialUsage .................... Passed 0.01 sec
     
    80% tests passed, 1 tests failed out of 5
     
    Total Test time (real) = 0.13 sec
     
    The following tests FAILED:
    2 - TutorialComp25 (Failed)
    Errors while running CTest
    make: *** [test] Error 8

    4、Step4
    检查系统是否支持log和exp函数。(log和exp都是数学运算函数)
    检查方法:
    (1)顶层配置中使用CheckFunctionExists.cmake
    # does this system provide the log and exp functions?
    include (CheckFunctionExists.cmake)
    check_function_exists (log HAVE_LOG)
    check_function_exists (exp HAVE_EXP)
    (2)修改.in文件,定义宏。(修改TutorialConfig.h.in,cmake执行中会把宏定义为合适的值,生成TurorialConfig.h,供编译时使用)
    // does the platform provide exp and log functions?
    #cmakedefine HAVE_LOG
    #cmakedefine HAVE_EXP
    (3)在代码中使用宏和log函数等。
    // if we have both log and exp then use them
    #if defined (HAVE_LOG) && defined (HAVE_EXP)
    result = exp(log(x)*0.5);
    #else // otherwise use an iterative approach
    Step4的完整配置、生成Makefile、编译、运行、安装、测试过程,参见最前面的“CMake使用步骤”。

    5、Step5
    动态生成源文件,自动把源文件编译进系统中。
    make的时候出错了:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step5/build>make
    Scanning dependencies of target MakeTable
    [ 25%] Building CXX object MathFunctions/CMakeFiles/MakeTable.dir/MakeTable.cxx.
    obj
    Linking CXX executable MakeTable.exe
    [ 25%] "Built target MakeTable"
    [ 50%] Generating Table.h
    '.' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    make[2]: *** [MathFunctions/Table.h] Error 1
    make[1]: *** [MathFunctions/CMakeFiles/MathFunctions.dir/all] Error 2
    make: *** [all] Error 2
    问题分析:
    首先看build/makefile文件,关于MakeTable有如下规则:
    # Build rule for target.
    MakeTable: cmake_check_build_system
    $(MAKE) -f CMakeFiles/Makefile2 MakeTable
    .PHONY : MakeTable
    再看Makefile2文件,找到出错时正在编译的目标。
    # All Build rule for target.
    MathFunctions/CMakeFiles/MakeTable.dir/all:
    $(MAKE) -f MathFunctions/CMakeFiles/MakeTable.dir/build.make MathFunctions/CMakeFiles/MakeTable.dir/depend
    $(MAKE) -f MathFunctions/CMakeFiles/MakeTable.dir/build.make MathFunctions/CMakeFiles/MakeTable.dir/build
    $(CMAKE_COMMAND) -E cmake_progress_report D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step5/build/CMakeFiles 1
    @echo "Built target MakeTable"
    .PHONY : MathFunctions/CMakeFiles/MakeTable.dir/all
    Make规则的执行顺序是按照命令的先后顺序:
    如果Makefile内容如下:
    all:
    echo "First line."
    echo "Second line."
    那么make结果:
    D:/Users/Desktop>make
    echo "First line."
    First line.
    echo "Second line."
    Second line.
    由此,Built target MakeTable输出之后才失败的。

    6、Step6
    生成各种平台Windows/Ubuntu/etc.上的安装包,包括二进制安装包和源码安装包。
    可以把依赖的系统库也打包。include (InstallRequiredSystemLibraries)
    使用CPack。
    由于Step1-7,后面一步的配置都包含了前面一步的配置,所以从Step5开始,就会遇到make的问题。
    为了编译通过,可以修改MathFunctions目录下的CMakeLists.txt和mysqrt.cxx,去掉所有对Table.h 的依赖。
    运行make package可以生成安装包:
    第一次,因为没有安装nsis,提示如下问题:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step6/build>make package
    [ 50%] "Built target MathFunctions"
    [100%] "Built target Tutorial"
    Run CPack packaging tool...
    CPack Error: Cannot find NSIS registry value. This is usually caused by NSIS not
    being installed. Please install NSIS from http://nsis.sourceforge.net
    CPack Error: Cannot initialize the generator NSIS
    make: *** [package] Error 1
    安装NSIS之后,运行成功:
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step6/build>make package
    [ 50%] "Built target MathFunctions"
    [100%] "Built target Tutorial"
    Run CPack packaging tool...
    CPack: Create package using NSIS
    CPack: Install projects
    CPack: - Run preinstall target for: Tutorial
    CPack: - Install project: Tutorial
    CPack: Compress package
    CPack: Finalize package
    CPack: Package D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step6/build/T
    utorial-1.0.1-win32.exe generated.
    生成了如下的Windows安装包文件:
    安装完成后,还可以很方便的卸载它:
    运行make package_source可以产生源代码包。(我的电脑上提示找不到合适的zip程序)
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step6/build>make package_sou
    rce
    Run CPack packaging tool for source...
    CPack Error: Cannot find a suitable ZIP program
    CPack Error: Cannot initialize the generator ZIP
    make: *** [package_source] Error 1
    7、Step7
    把结果发布到dashboard。
    下面网址是一个公开的dashboard:
    http://www.cdash.org/CDash/index.php?project=PublicDashboard
    dashboard上显示的项目名称通过如下方式设置:
    需要先把cmake/bin目录加入path中,然后执行ctest -D Experimental。这里遇到了一个错误。
    D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step7/build>ctest -D Experim
    ental
    Site: JELLY-PC2
    Build name: Win32-make
    Create new tag: 20100521-1833 - Experimental
    Configure project
    Each . represents 1024 bytes of output
    . Size of output: 0K
    Build project
    Each symbol represents 1024 bytes of output.
    '!' represents an error and '*' a warning.
    . Size of output: 0K
    0 Compiler errors
    0 Compiler warnings
    Test project D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutorial/Step7/build
    Start 1: TutorialRuns
    1/9 Test #1: TutorialRuns ..................... Passed 0.01 sec
    Start 2: TutorialUsage
    2/9 Test #2: TutorialUsage .................... Passed 0.01 sec
    Start 3: TutorialComp4
    3/9 Test #3: TutorialComp4 .................... Passed 0.01 sec
    Start 4: TutorialComp9
    4/9 Test #4: TutorialComp9 .................... Passed 0.01 sec
    Start 5: TutorialComp5
    5/9 Test #5: TutorialComp5 .................... Passed 0.01 sec
    Start 6: TutorialComp7
    6/9 Test #6: TutorialComp7 .................... Passed 0.01 sec
    Start 7: TutorialComp25
    7/9 Test #7: TutorialComp25 ................... Passed 0.01 sec
    Start 8: TutorialComp-25
    8/9 Test #8: TutorialComp-25 .................. Passed 0.01 sec
    Start 9: TutorialComp0.0001
    9/9 Test #9: TutorialComp0.0001 ............... Passed 0.01 sec
     
    100% tests passed, 0 tests failed out of 9
     
    Total Test time (real) = 0.19 sec
    Performing coverage
    Cannot find any coverage files. Ignoring Coverage request.
    Submit files (using http)
    Using HTTP submit method
    Drop site:http://
    Error when uploading file: D:/Projects/Lab/testngpp/cmake-2.8.1/Tests/Tutoria
    l/Step7/build/Testing/20100521-1833/Build.xml
    Error message was: couldn't connect to host
    Problems when submitting via HTTP
    Errors while running CTest
    产生了如下一些文件:
     
     
     
  • 相关阅读:
    使用 Facebook开源动画库 POP 实现真实衰减动画
    在命名空间下定义类型
    作为程序猿我给csdn博客加入打赏功能
    linux高可用集群heartbeat实现http的高可用
    杭电 HDU 1247 ACMHat’s Words(trie树 或着STL)
    取石子(一)-博弈数论
    区块链技术开发怎么结合已有产业链落地?
    KafkaConsumer assign VS subscribe
    KafkaConsumer assign VS subscribe
    KafkaConsumer assign VS subscribe
  • 原文地址:https://www.cnblogs.com/hoojjack/p/3849537.html
Copyright © 2020-2023  润新知