cmake_cmakelists - CSDN
cmake 订阅
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。 展开全文
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。
信息
外文名
cross platform make
描    述
所有平台的安装(编译过程)
类    型
跨平台的安装(编译)工具
中文名
描述所有平台的安装(编译过程)
功    能
可以编译源代码、制作程式库
cmake定义
CMake 可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支持静态与动态程式库的建构。“CMake”这个名字是“cross platform make”的缩写。虽然名字中含有“make”,但是CMake和Unix上常见的“make”系统是分开的,而且更为高阶。
收起全文
精华内容
参与话题
  • 本课程是针对Windows平台,使用CMake来编译代码,运行程序。 比如创建动态库、静态库等基本项目,使用C++11, C++14等高级特性。 CMake是跨平台开发必不可少的工具。 很多同学在移植代码的时候,发现需要把Linux上的...
  • 超详细的cmake教程

    万次阅读 多人点赞 2019-03-04 22:20:19
    什么是 CMake All problems in computer science can be solved by another level of indirection. David Wheeler 你或许听过好几种 Make 工具,例如GNU Make,QT 的qmake,微软的MS nmake,BSD Make(p...

    什么是 CMake

     

    All problems in computer science can be solved by another level of indirection.

    David Wheeler

     

    你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。

    CMakeCMake附图 1 CMake就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTKITKKDEOpenCVOSG 等 [1]

    在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

    1. 编写 CMake 配置文件 CMakeLists.txt 。
    2. 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile 1 1ccmake 和 cmake 的区别在于前者提供了一个交互式的界面。。其中, PATH 是 CMakeLists.txt 所在的目录。
    3. 使用 make 命令进行编译。

    本文将从实例入手,一步步讲解 CMake 的常见用法,文中所有的实例代码可以在这里找到。如果你读完仍觉得意犹未尽,可以继续学习我在文章末尾提供的其他资源。

    入门案例:单个源文件

     

    本节对应的源代码所在目录:Demo1

     

    对于简单的项目,只需要写几行代码就可以了。例如,假设现在我们的项目中只有一个源文件 main.cc ,该程序的用途是计算一个数的指数幂。

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    
     

    #include <stdio.h>

    #include <stdlib.h>

    /**

    * power - Calculate the power of number.

    * @param base: Base value.

    * @param exponent: Exponent value.

    *

    * @return base raised to the power exponent.

    */

    double power(double base, int exponent)

    {

    int result = base;

    int i;

    if (exponent == 0) {

    return 1;

    }

    for(i = 1; i < exponent; ++i){

    result = result * base;

    }

    return result;

    }

    int main(int argc, char *argv[])

    {

    if (argc < 3){

    printf("Usage: %s base exponent \n", argv[0]);

    return 1;

    }

    double base = atof(argv[1]);

    int exponent = atoi(argv[2]);

    double result = power(base, exponent);

    printf("%g ^ %d is %g\n", base, exponent, result);

    return 0;

    }

     

    编写 CMakeLists.txt

    首先编写 CMakeLists.txt 文件,并保存在与 main.cc 源文件同个目录下:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    
     

    # CMake 最低版本号要求

    cmake_minimum_required (VERSION 2.8)

    # 项目信息

    project (Demo1)

    # 指定生成目标

    add_executable(Demo main.cc)

     

    CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。

    对于上面的 CMakeLists.txt 文件,依次出现了几个命令:

    1. cmake_minimum_required:指定运行此配置文件所需的 CMake 的最低版本;
    2. project:参数值是 Demo1,该命令表示项目的名称是 Demo1 。
    3. add_executable: 将名为 main.cc 的源文件编译成一个名称为 Demo 的可执行文件。

    编译项目

    之后,在当前目录执行 cmake . ,得到 Makefile 后再使用 make 命令编译得到 Demo1 可执行文件。

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    
     

    [ehome@xman Demo1]$ cmake .

    -- The C compiler identification is GNU 4.8.2

    -- The CXX compiler identification is GNU 4.8.2

    -- Check for working C compiler: /usr/sbin/cc

    -- Check for working C compiler: /usr/sbin/cc -- works

    -- Detecting C compiler ABI info

    -- Detecting C compiler ABI info - done

    -- Check for working CXX compiler: /usr/sbin/c++

    -- Check for working CXX compiler: /usr/sbin/c++ -- works

    -- Detecting CXX compiler ABI info

    -- Detecting CXX compiler ABI info - done

    -- Configuring done

    -- Generating done

    -- Build files have been written to: /home/ehome/Documents/programming/C/power/Demo1

    [ehome@xman Demo1]$ make

    Scanning dependencies of target Demo

    [100%] Building C object CMakeFiles/Demo.dir/main.cc.o

    Linking C executable Demo

    [100%] Built target Demo

    [ehome@xman Demo1]$ ./Demo 5 4

    5 ^ 4 is 625

    [ehome@xman Demo1]$ ./Demo 7 3

    7 ^ 3 is 343

    [ehome@xman Demo1]$ ./Demo 2 10

    2 ^ 10 is 1024

     

    多个源文件

    同一目录,多个源文件

     

    本小节对应的源代码所在目录:Demo2

     

    上面的例子只有单个源文件。现在假如把 power 函数单独写进一个名为 MathFunctions.c 的源文件里,使得这个工程变成如下的形式:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    
     

    ./Demo2

    |

    +--- main.cc

    |

    +--- MathFunctions.cc

    |

    +--- MathFunctions.h

     

    这个时候,CMakeLists.txt 可以改成如下的形式:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    
     

    # CMake 最低版本号要求

    cmake_minimum_required (VERSION 2.8)

    # 项目信息

    project (Demo2)

    # 指定生成目标

    add_executable(Demo main.cc MathFunctions.cc)

     

    唯一的改动只是在 add_executable 命令中增加了一个 MathFunctions.cc 源文件。这样写当然没什么问题,但是如果源文件很多,把所有源文件的名字都加进去将是一件烦人的工作。更省事的方法是使用 aux_source_directory 命令,该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。其语法如下:

     

    
     

    1

    
     

    aux_source_directory(<dir> <variable>)

     

    因此,可以修改 CMakeLists.txt 如下:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    
     

    # CMake 最低版本号要求

    cmake_minimum_required (VERSION 2.8)

    # 项目信息

    project (Demo2)

    # 查找当前目录下的所有源文件

    # 并将名称保存到 DIR_SRCS 变量

    aux_source_directory(. DIR_SRCS)

    # 指定生成目标

    add_executable(Demo ${DIR_SRCS})

     

    这样,CMake 会将当前目录所有源文件的文件名赋值给变量 DIR_SRCS ,再指示变量 DIR_SRCS 中的源文件需要编译成一个名称为 Demo 的可执行文件。

    多个目录,多个源文件

     

    本小节对应的源代码所在目录:Demo3

     

    现在进一步将 MathFunctions.h 和 MathFunctions.cc 文件移动到 math 目录下。

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    
     

    ./Demo3

    |

    +--- main.cc

    |

    +--- math/

    |

    +--- MathFunctions.cc

    |

    +--- MathFunctions.h

     

    对于这种情况,需要分别在项目根目录 Demo3 和 math 目录里各编写一个 CMakeLists.txt 文件。为了方便,我们可以先将 math 目录里的文件编译成静态库再由 main 函数调用。

    根目录中的 CMakeLists.txt :

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    
     

    # CMake 最低版本号要求

    cmake_minimum_required (VERSION 2.8)

    # 项目信息

    project (Demo3)

    # 查找当前目录下的所有源文件

    # 并将名称保存到 DIR_SRCS 变量

    aux_source_directory(. DIR_SRCS)

    # 添加 math 子目录

    add_subdirectory(math)

    # 指定生成目标

    add_executable(Demo main.cc)

    # 添加链接库

    target_link_libraries(Demo MathFunctions)

     

    该文件添加了下面的内容: 第3行,使用命令 add_subdirectory 指明本项目包含一个子目录 math,这样 math 目录下的 CMakeLists.txt 文件和源代码也会被处理 。第6行,使用命令 target_link_libraries 指明可执行文件 main 需要连接一个名为 MathFunctions 的链接库 。

    子目录中的 CMakeLists.txt:

     

    
     

    1

    2

    3

    4

    5

    6

    
     

    # 查找当前目录下的所有源文件

    # 并将名称保存到 DIR_LIB_SRCS 变量

    aux_source_directory(. DIR_LIB_SRCS)

    # 生成链接库

    add_library (MathFunctions ${DIR_LIB_SRCS})

     

    在该文件中使用命令 add_library 将 src 目录中的源文件编译为静态链接库。

    自定义编译选项

     

    本节对应的源代码所在目录:Demo4

     

    CMake 允许为项目增加编译选项,从而可以根据用户的环境和需求选择最合适的编译方案。

    例如,可以将 MathFunctions 库设为一个可选的库,如果该选项为 ON ,就使用该库定义的数学函数来进行运算。否则就调用标准库中的数学函数库。

    修改 CMakeLists 文件

    我们要做的第一步是在顶层的 CMakeLists.txt 文件中添加该选项:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    
     

    # CMake 最低版本号要求

    cmake_minimum_required (VERSION 2.8)

    # 项目信息

    project (Demo4)

    # 加入一个配置头文件,用于处理 CMake 对源码的设置

    configure_file (

    "${PROJECT_SOURCE_DIR}/config.h.in"

    "${PROJECT_BINARY_DIR}/config.h"

    )

    # 是否使用自己的 MathFunctions 库

    option (USE_MYMATH

    "Use provided math implementation" ON)

    # 是否加入 MathFunctions 库

    if (USE_MYMATH)

    include_directories ("${PROJECT_SOURCE_DIR}/math")

    add_subdirectory (math)

    set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)

    endif (USE_MYMATH)

    # 查找当前目录下的所有源文件

    # 并将名称保存到 DIR_SRCS 变量

    aux_source_directory(. DIR_SRCS)

    # 指定生成目标

    add_executable(Demo ${DIR_SRCS})

    target_link_libraries (Demo ${EXTRA_LIBS})

     

    其中:

    1. 第7行的 configure_file 命令用于加入一个配置头文件 config.h ,这个文件由 CMake 从 config.h.in 生成,通过这样的机制,将可以通过预定义一些参数和变量来控制代码的生成。
    2. 第13行的 option 命令添加了一个 USE_MYMATH 选项,并且默认值为 ON 。
    3. 第17行根据 USE_MYMATH 变量的值来决定是否使用我们自己编写的 MathFunctions 库。

    修改 main.cc 文件

    之后修改 main.cc 文件,让其根据 USE_MYMATH 的预定义值来决定是否调用标准库还是 MathFunctions 库:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    
     

    #include

    #include

    #include "config.h"

    #ifdef USE_MYMATH

    #include "math/MathFunctions.h"

    #else

    #include

    #endif

    int main(int argc, char *argv[])

    {

    if (argc < 3){

    printf("Usage: %s base exponent \n", argv[0]);

    return 1;

    }

    double base = atof(argv[1]);

    int exponent = atoi(argv[2]);

    #ifdef USE_MYMATH

    printf("Now we use our own Math library. \n");

    double result = power(base, exponent);

    #else

    printf("Now we use the standard library. \n");

    double result = pow(base, exponent);

    #endif

    printf("%g ^ %d is %g\n", base, exponent, result);

    return 0;

    }

     

    编写 config.h.in 文件

    上面的程序值得注意的是第2行,这里引用了一个 config.h 文件,这个文件预定义了 USE_MYMATH 的值。但我们并不直接编写这个文件,为了方便从 CMakeLists.txt 中导入配置,我们编写一个 config.h.in 文件,内容如下:

     

    
     

    1

    
     

    #cmakedefine USE_MYMATH

     

    这样 CMake 会自动根据 CMakeLists 配置文件中的设置自动生成 config.h 文件。

    编译项目

    现在编译一下这个项目,为了便于交互式的选择该变量的值,可以使用 ccmake 命令 2 2也可以使用 cmake -i 命令,该命令会提供一个会话式的交互式配置界面。:

    CMake的交互式配置界面

    从中可以找到刚刚定义的 USE_MYMATH 选项,按键盘的方向键可以在不同的选项窗口间跳转,按下 enter 键可以修改该选项。修改完成后可以按下 c 选项完成配置,之后再按 g 键确认生成 Makefile 。ccmake 的其他操作可以参考窗口下方给出的指令提示。

    我们可以试试分别将 USE_MYMATH 设为 ON 和 OFF 得到的结果:

    USE_MYMATH 为 ON

    运行结果:

     

    
     

    1

    2

    3

    4

    5

    
     

    [ehome@xman Demo4]$ ./Demo

    Now we use our own MathFunctions library.

    7 ^ 3 = 343.000000

    10 ^ 5 = 100000.000000

    2 ^ 10 = 1024.000000

     

    此时 config.h 的内容为:

     

    
     

    1

    
     

    #define USE_MYMATH

     

    USE_MYMATH 为 OFF

    运行结果:

     

    
     

    1

    2

    3

    4

    5

    
     

    [ehome@xman Demo4]$ ./Demo

    Now we use the standard library.

    7 ^ 3 = 343.000000

    10 ^ 5 = 100000.000000

    2 ^ 10 = 1024.000000

     

    此时 config.h 的内容为:

     

    
     

    1

    
     

    /* #undef USE_MYMATH */

     

    安装和测试

     

    本节对应的源代码所在目录:Demo5

     

    CMake 也可以指定安装规则,以及添加测试。这两个功能分别可以通过在产生 Makefile 后使用 make install 和 make test 来执行。在以前的 GNU Makefile 里,你可能需要为此编写 install 和 test 两个伪目标和相应的规则,但在 CMake 里,这样的工作同样只需要简单的调用几条命令。

    定制安装规则

    首先先在 math/CMakeLists.txt 文件里添加下面两行:

     

    
     

    1

    2

    3

    
     

    # 指定 MathFunctions 库的安装路径

    install (TARGETS MathFunctions DESTINATION bin)

    install (FILES MathFunctions.h DESTINATION include)

     

    指明 MathFunctions 库的安装路径。之后同样修改根目录的 CMakeLists 文件,在末尾添加下面几行:

     

    
     

    1

    2

    3

    4

    
     

    # 指定安装路径

    install (TARGETS Demo DESTINATION bin)

    install (FILES "${PROJECT_BINARY_DIR}/config.h"

    DESTINATION include)

     

    通过上面的定制,生成的 Demo 文件和 MathFunctions 函数库 libMathFunctions.o 文件将会被复制到 /usr/local/bin 中,而 MathFunctions.h 和生成的 config.h 文件则会被复制到 /usr/local/include 中。我们可以验证一下3 3顺带一提的是,这里的 /usr/local/ 是默认安装到的根目录,可以通过修改 CMAKE_INSTALL_PREFIX 变量的值来指定这些文件应该拷贝到哪个根目录。:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    
     

    [ehome@xman Demo5]$ sudo make install

    [ 50%] Built target MathFunctions

    [100%] Built target Demo

    Install the project...

    -- Install configuration: ""

    -- Installing: /usr/local/bin/Demo

    -- Installing: /usr/local/include/config.h

    -- Installing: /usr/local/bin/libMathFunctions.a

    -- Up-to-date: /usr/local/include/MathFunctions.h

    [ehome@xman Demo5]$ ls /usr/local/bin

    Demo libMathFunctions.a

    [ehome@xman Demo5]$ ls /usr/local/include

    config.h MathFunctions.h

     

    为工程添加测试

    添加测试同样很简单。CMake 提供了一个称为 CTest 的测试工具。我们要做的只是在项目根目录的 CMakeLists 文件中调用一系列的 add_test 命令。

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    
     

    # 启用测试

    enable_testing()

    # 测试程序是否成功运行

    add_test (test_run Demo 5 2)

    # 测试帮助信息是否可以正常提示

    add_test (test_usage Demo)

    set_tests_properties (test_usage

    PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")

    # 测试 5 的平方

    add_test (test_5_2 Demo 5 2)

    set_tests_properties (test_5_2

    PROPERTIES PASS_REGULAR_EXPRESSION "is 25")

    # 测试 10 的 5 次方

    add_test (test_10_5 Demo 10 5)

    set_tests_properties (test_10_5

    PROPERTIES PASS_REGULAR_EXPRESSION "is 100000")

    # 测试 2 的 10 次方

    add_test (test_2_10 Demo 2 10)

    set_tests_properties (test_2_10

    PROPERTIES PASS_REGULAR_EXPRESSION "is 1024")

     

    上面的代码包含了四个测试。第一个测试 test_run 用来测试程序是否成功运行并返回 0 值。剩下的三个测试分别用来测试 5 的 平方、10 的 5 次方、2 的 10 次方是否都能得到正确的结果。其中 PASS_REGULAR_EXPRESSION 用来测试输出是否包含后面跟着的字符串。

    让我们看看测试的结果:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    
     

    [ehome@xman Demo5]$ make test

    Running tests...

    Test project /home/ehome/Documents/programming/C/power/Demo5

    Start 1: test_run

    1/4 Test #1: test_run ......................... Passed 0.00 sec

    Start 2: test_5_2

    2/4 Test #2: test_5_2 ......................... Passed 0.00 sec

    Start 3: test_10_5

    3/4 Test #3: test_10_5 ........................ Passed 0.00 sec

    Start 4: test_2_10

    4/4 Test #4: test_2_10 ........................ Passed 0.00 sec

    100% tests passed, 0 tests failed out of 4

    Total Test time (real) = 0.01 sec

     

    如果要测试更多的输入数据,像上面那样一个个写测试用例未免太繁琐。这时可以通过编写宏来实现:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    
     

    # 定义一个宏,用来简化测试工作

    macro (do_test arg1 arg2 result)

    add_test (test_${arg1}_${arg2} Demo ${arg1} ${arg2})

    set_tests_properties (test_${arg1}_${arg2}

    PROPERTIES PASS_REGULAR_EXPRESSION ${result})

    endmacro (do_test)

    # 使用该宏进行一系列的数据测试

    do_test (5 2 "is 25")

    do_test (10 5 "is 100000")

    do_test (2 10 "is 1024")

     

    关于 CTest 的更详细的用法可以通过 man 1 ctest 参考 CTest 的文档。

    支持 gdb

    让 CMake 支持 gdb 的设置也很容易,只需要指定 Debug 模式下开启 -g 选项:

     

    
     

    1

    2

    3

    
     

    set(CMAKE_BUILD_TYPE "Debug")

    set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")

    set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

     

    之后可以直接对生成的程序使用 gdb 来调试。

    添加环境检查

     

    本节对应的源代码所在目录:Demo6

     

    有时候可能要对系统环境做点检查,例如要使用一个平台相关的特性的时候。在这个例子中,我们检查系统是否自带 pow 函数。如果带有 pow 函数,就使用它;否则使用我们定义的 power 函数。

    添加 CheckFunctionExists 宏

    首先在顶层 CMakeLists 文件中添加 CheckFunctionExists.cmake 宏,并调用 check_function_exists 命令测试链接器是否能够在链接阶段找到 pow 函数。

     

    
     

    1

    2

    3

    
     

    # 检查系统是否支持 pow 函数

    include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)

    check_function_exists (pow HAVE_POW)

     

    将上面这段代码放在 configure_file 命令前。

    预定义相关宏变量

    接下来修改 config.h.in 文件,预定义相关的宏变量。

     

    
     

    1

    2

    
     

    // does the platform provide pow function?

    #cmakedefine HAVE_POW

     

    在代码中使用宏和函数

    最后一步是修改 main.cc ,在代码中使用宏和函数:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    
     

    #ifdef HAVE_POW

    printf("Now we use the standard library. \n");

    double result = pow(base, exponent);

    #else

    printf("Now we use our own Math library. \n");

    double result = power(base, exponent);

    #endif

     

    添加版本号

     

    本节对应的源代码所在目录:Demo7

     

    给项目添加和维护版本号是一个好习惯,这样有利于用户了解每个版本的维护情况,并及时了解当前所用的版本是否过时,或是否可能出现不兼容的情况。

    首先修改顶层 CMakeLists 文件,在 project 命令之后加入如下两行:

     

    
     

    1

    2

    
     

    set (Demo_VERSION_MAJOR 1)

    set (Demo_VERSION_MINOR 0)

     

    分别指定当前的项目的主版本号和副版本号。

    之后,为了在代码中获取版本信息,我们可以修改 config.h.in 文件,添加两个预定义变量:

     

    
     

    1

    2

    3

    
     

    // the configured options and settings for Tutorial

    #define Demo_VERSION_MAJOR @Demo_VERSION_MAJOR@

    #define Demo_VERSION_MINOR @Demo_VERSION_MINOR@

     

    这样就可以直接在代码中打印版本信息了:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    
     

    #include <stdio.h>

    #include <stdlib.h>

    #include <math.h>

    #include "config.h"

    #include "math/MathFunctions.h"

    int main(int argc, char *argv[])

    {

    if (argc < 3){

    // print version info

    printf("%s Version %d.%d\n",

    argv[0],

    Demo_VERSION_MAJOR,

    Demo_VERSION_MINOR);

    printf("Usage: %s base exponent \n", argv[0]);

    return 1;

    }

    double base = atof(argv[1]);

    int exponent = atoi(argv[2]);

    #if defined (HAVE_POW)

    printf("Now we use the standard library. \n");

    double result = pow(base, exponent);

    #else

    printf("Now we use our own Math library. \n");

    double result = power(base, exponent);

    #endif

    printf("%g ^ %d is %g\n", base, exponent, result);

    return 0;

    }

     

    生成安装包

     

    本节对应的源代码所在目录:Demo8

     

    本节将学习如何配置生成各种平台上的安装包,包括二进制安装包和源码安装包。为了完成这个任务,我们需要用到 CPack ,它同样也是由 CMake 提供的一个工具,专门用于打包。

    首先在顶层的 CMakeLists.txt 文件尾部添加下面几行:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    
     

    # 构建一个 CPack 安装包

    include (InstallRequiredSystemLibraries)

    set (CPACK_RESOURCE_FILE_LICENSE

    "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")

    set (CPACK_PACKAGE_VERSION_MAJOR "${Demo_VERSION_MAJOR}")

    set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}")

    include (CPack)

     

    上面的代码做了以下几个工作:

    1. 导入 InstallRequiredSystemLibraries 模块,以便之后导入 CPack 模块;
    2. 设置一些 CPack 相关变量,包括版权信息和版本信息,其中版本信息用了上一节定义的版本号;
    3. 导入 CPack 模块。

    接下来的工作是像往常一样构建工程,并执行 cpack 命令。

    • 生成二进制安装包:

     

    
     

    1

    
     

    cpack -C CPackConfig.cmake

     

    • 生成源码安装包

     

    
     

    1

    
     

    cpack -C CPackSourceConfig.cmake

     

    我们可以试一下。在生成项目后,执行 cpack -C CPackConfig.cmake 命令:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    
     

    [ehome@xman Demo8]$ cpack -C CPackSourceConfig.cmake

    CPack: Create package using STGZ

    CPack: Install projects

    CPack: - Run preinstall target for: Demo8

    CPack: - Install project: Demo8

    CPack: Create package

    CPack: - package: /home/ehome/Documents/programming/C/power/Demo8/Demo8-1.0.1-Linux.sh generated.

    CPack: Create package using TGZ

    CPack: Install projects

    CPack: - Run preinstall target for: Demo8

    CPack: - Install project: Demo8

    CPack: Create package

    CPack: - package: /home/ehome/Documents/programming/C/power/Demo8/Demo8-1.0.1-Linux.tar.gz generated.

    CPack: Create package using TZ

    CPack: Install projects

    CPack: - Run preinstall target for: Demo8

    CPack: - Install project: Demo8

    CPack: Create package

    CPack: - package: /home/ehome/Documents/programming/C/power/Demo8/Demo8-1.0.1-Linux.tar.Z generated.

     

    此时会在该目录下创建 3 个不同格式的二进制包文件:

     

    
     

    1

    2

    
     

    [ehome@xman Demo8]$ ls Demo8-*

    Demo8-1.0.1-Linux.sh Demo8-1.0.1-Linux.tar.gz Demo8-1.0.1-Linux.tar.Z

     

    这 3 个二进制包文件所包含的内容是完全相同的。我们可以执行其中一个。此时会出现一个由 CPack 自动生成的交互式安装界面:

     

    
     

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    
     

    [ehome@xman Demo8]$ sh Demo8-1.0.1-Linux.sh

    Demo8 Installer Version: 1.0.1, Copyright (c) Humanity

    This is a self-extracting archive.

    The archive will be extracted to: /home/ehome/Documents/programming/C/power/Demo8

    If you want to stop extracting, please press <ctrl-C>.

    The MIT License (MIT)

    Copyright (c) 2013 Joseph Pan(http://hahack.com)

    Permission is hereby granted, free of charge, to any person obtaining a copy of

    this software and associated documentation files (the "Software"), to deal in

    the Software without restriction, including without limitation the rights to

    use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of

    the Software, and to permit persons to whom the Software is furnished to do so,

    subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all

    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS

    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR

    COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER

    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN

    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    Do you accept the license? [yN]:

    y

    By default the Demo8 will be installed in:

    "/home/ehome/Documents/programming/C/power/Demo8/Demo8-1.0.1-Linux"

    Do you want to include the subdirectory Demo8-1.0.1-Linux?

    Saying no will install in: "/home/ehome/Documents/programming/C/power/Demo8" [Yn]:

    y

    Using target directory: /home/ehome/Documents/programming/C/power/Demo8/Demo8-1.0.1-Linux

    Extracting, please wait...

    Unpacking finished successfully

     

    完成后提示安装到了 Demo8-1.0.1-Linux 子目录中,我们可以进去执行该程序:

     

    
     

    1

    2

    3

    
     

    [ehome@xman Demo8]$ ./Demo8-1.0.1-Linux/bin/Demo 5 2

    Now we use our own Math library.

    5 ^ 2 is 25

     

    关于 CPack 的更详细的用法可以通过 man 1 cpack 参考 CPack 的文档。

    将其他平台的项目迁移到 CMake

    CMake 可以很轻松地构建出在适合各个平台执行的工程环境。而如果当前的工程环境不是 CMake ,而是基于某个特定的平台,是否可以迁移到 CMake 呢?答案是可能的。下面针对几个常用的平台,列出了它们对应的迁移方案。

    autotools

    qmake

    Visual Studio

    • vcproj2cmake.rb 可以根据 Visual Studio 的工程文件(后缀名是 .vcproj 或 .vcxproj)生成 CMakeLists.txt 文件。
    • vcproj2cmake.ps1 vcproj2cmake 的 PowerShell 版本。
    • folders4cmake 根据 Visual Studio 项目文件生成相应的 “source_group” 信息,这些信息可以很方便的在 CMake 脚本中使用。支持 Visual Studio 9/10 工程文件。

    CMakeLists.txt 自动推导

    • gencmake 根据现有文件推导 CMakeLists.txt 文件。
    • CMakeListGenerator 应用一套文件和目录分析创建出完整的 CMakeLists.txt 文件。仅支持 Win32 平台。

    相关链接

    1. 官方主页
    2. 官方文档
    3. 官方教程
    4. Wiki
    5. FAQ
    6. bug tracker
    7. 邮件列表:
    8. 其他推荐文章

    类似工具

    • SCons:Eric S. Raymond、Timothee Besset、Zed A. Shaw 等大神力荐的项目架构工具。和 CMake 的最大区别是使用 Python 作为执行脚本。

    1. 这个页面详细罗列了使用 CMake 的知名项目 

    展开全文
  • CMake入门实践(一) 什么是cmake

    万次阅读 多人点赞 2018-03-05 20:10:08
    一.CMake简介 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 ...

    一.CMake简介

    CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

    cmake 的特点主要有:

    1. 开放源代码,使用类 BSD 许可发布。http://cmake.org/HTML/Copyright.html
    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 在工具链中没有 libtool
    6. 可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。

    在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

    1. 编写 CMake 配置文件 CMakeLists.txt 。
    2. 执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile。其中, PATH 是 CMakeLists.txt 所在的目录。
    3. 使用 make 命令进行编译。

    二.Hello World

    没有”Hello World”的教程不是好教程.这里首先举一个Hello world的例子给大家做一个对于CMake的感性理解.
    详细的项目代码可以见: LearningCMake/HelloWorld/

    比如我现在项目目录叫做HelloWorld,其中建立两个文件,分别是main.cppCMakeLists.txt(注意文件名大小写):

    main.cpp文件中就是非常简单的输出Hello world的代码了,如下:

    //main.cpp
    #include <iostream>
    int main() {
        std::cout << "Hello, World!" << std::endl;
        return 0;
    }

    CmakeLists.txt 文件内容:

    cmake_minimum_required(VERSION 3.9)
    project(HelloWorld)
    
    set(CMAKE_CXX_STANDARD 11)
    
    add_executable(HelloWorld main.cpp)

    所有的文件创建完成后,HelloWorld目录中应该存在 main.cppCMakeLists.txt 两个文件. 接下来我们来构建这个工程,在这个目录运行:

    cmake .

    注意命令后面的点号,代表本目录.

    输出大概是这个样子:

    -- The C compiler identification is GNU 5.4.0
    -- The CXX compiler identification is GNU 5.4.0
    -- Check for working C compiler: /usr/bin/cc
    -- Check for working C compiler: /usr/bin/cc -- works
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Detecting C compile features
    -- Detecting C compile features - 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
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/enningxie/xiekun/WorkSpace/LearningCMake/HelloWorld

    再让我们看一下目录中的内容:
    你会发现,系统自动生成了:CMakeFiles, CMakeCache.txt, cmake_install.cmake 等文件,并且生成了Makefile. 现在不需要理会这些文件的作用,以后你也可以不去理会。最关键的是,它自动生成了Makefile.

    然后进行工程的实际构建,在这个目录输入make 命令,大概会得到如下的彩色输出:

    Scanning dependencies of target HelloWorld
    [ 50%] Building CXX object CMakeFiles/HelloWorld.dir/main.cpp.o
    [100%] Linking CXX executable HelloWorld
    [100%] Built target HelloWorld

    如果你需要看到 make 构建的详细过程,可以使用 make VERBOSE=1 来进行构建。
    这时候,我们需要的目标文件 HelloWorld已经构建完成,位于当前目录,尝试运行一下:
    ./HelloWorld得到输出:

    Hello,World!

    三.基本用法解释

    上面用一个非常简单的HelloWorld例子简单介绍了构建使用cmake构建项目的完整过程.但是其中还有很多地方新手可能不是很理解.比如CMake怎么使用. CMakeList.txt 里面到底是一些什么东西等等. 这部分就来讲一下上面那个简单的项目到底用了一些什么东西.更加复杂的以后再讲到,这里确保把最基本的一些给理清楚.

    重新看一下 CMakeLists.txt,这个文件是 cmake 的构建定义文件,文件名
    是大小写相关的,如果工程存在多个目录,需要确保每个要管理的目录都存在一个
    CMakeLists.txt。(关于多目录构建,后面我们会提到,这里不作过多解释)。

    上面例子中的 CMakeLists.txt 文件内容如下:

    cmake_minimum_required(VERSION 3.9)
    
    project(HelloWorld)
    
    set(CMAKE_CXX_STANDARD 11)
    
    add_executable(HelloWorld main.cpp)

    先看第一行cmake_minimum_required(VERSION 3.9),这行看意思都能够直接看出来了,表示指定运行此配置文件所需的 CMake 的最低版本;所以看到其他的CMakeList文件没有写这个也是正常的.但是还是推荐写,是因为避免引起cmake不同版本之间构建错误的问题.

    然后看第二行,project(HelloWorld) 该命令指定项目的名称,比如这里的项目名称为HelloWorld.更加详细的来说, project 指令的语法是:

    project(projectname [CXX] [C] [Java])

    你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,
    默认情况表示支持所有语言。所以我们常见使用的时候,就直接使用project(projectname) 就够了. 这个指令隐式的定义了两个 cmake 变量:
    _BINARY_DIR 以及_SOURCE_DIR,这里就是
    HelloWorld_BINARY_DIRHelloWorld_SOURCE_DIR.
    因为采用的是内部编译,两个变量目前指的都是工程所在路径LearningCMake/HelloWorld/,后面我们会讲到外部编译,两者所指代的内容会有所不同。

    同时 cmake 系统也帮助我们预定义了 PROJECT_BINARY_DIRPROJECT_SOURCE_DIR变量,他们的值分别跟 HelloWorld_BINARY_DIRHelloWorld_SOURCE_DIR 一致。 为了统一起见,建议以后直接使用 PROJECT_BINARY_DIRPROJECT_SOURCE_DIR,即
    使修改了工程名称,也不会影响这两个变量。如果使用了
    <projectname>_SOURCE_DIR,修改工程名称后,需要同时修改这些变量。

    然后来看第三行set(CMAKE_CXX_STANDARD 11) 这里是把之后的编译选项设置为了C++ 11,

    set 指令的语法是:

    set (VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

    现阶段,你只需要了解 set 指令可以用来显式的定义变量即可。
    比如我们用到的是 set(SRC_LIST main.c),如果有多个源文件,也可以定义成:
    set(SRC_LIST main.c t1.c t2.c)

    然后我们来看最后一行add_executable(HelloWorld main.cpp),这行的作用就是将名为 main.cpp 的源文件编译成一个名称为 HelloWorld 的可执行文件。同样的,更加详细的用法如下:

    add_executable(executable_name ${SRC_LIST})

    定义了这个工程会生成一个文件名为 executable_name 的可执行文件,相关的源文件是 SRC_LIST
    定义的源文件列表.

    四.内部构建和外部构建

    内部构建和外部构建这个词这么装逼,其实实际上面非常简单,别被吓到.

    通俗一点,内部构建就是在项目内部,有CMakeList.txt的地方,直接cmake .,比如我们前面讲的简单案例都是最简单的内部构建. 结果你也看见了,就是在项目下面生成了很多的临时文件.

    外部构建就是不直接在项目下面运行cmake, 而是自己建立一个接受cmake之后的临时文件的文件夹,然后再该文件夹下面调用cmake <CMakeList_path> 来构建.运行 make 构建工程,就会在当前目录(build 目录)中获得目标文件 hello。上述过程就是所谓的out-of-source外部编译,一个最大的好处是,对于原有的工程没有任何影响,所有动作全部发生在编译目录。

    有编译过OpenCV或者其他类似项目的童鞋,都应该知道,编译OpenCV的时候,我们常常自己建立一个build目录,然后在该目录下面运行cmake,最终临时文件就会在这个目录下面生成.

    这里直接举一个例子,完整项目代码:LearningCMake/4.HelloWorld4/

    这里代码结构和CMakeList.txt都和第一个最简单的是差不多的.但是这里有一个不同,就是在里面建立了一个build文件夹.然后再build文件夹里面运行cmake ..,结果就是之前的临时文件都存放在了这个build文件夹里面,同时在这个文件夹里面直接make可以得到最终的可执行文件.

    到了这里,结合CMakeList.txt文件中每个命令语句和生成执行文件的详细步骤.你应该对于cmake的运作过程有了一个基本的了解.当然这并不等于全部,有了这些基础,后面慢慢介绍更多更加常用的用法.

    展开全文
  • CMake的安装及其简单使用

    万次阅读 2018-02-12 13:33:27
    一、CMake的安装 (本文是在Ubuntu 17.04下的安装,安装的版本为 2.8.9)1、卸载原有系统上安装的cmake,便于安装更高版本的cmake。(如果不卸载系统自带的,直接安装,可能会出现错误。) apt-get autoremove cmake...
    一、CMake的安装 (本文是在Ubuntu 17.04下的安装,安装的版本为 2.8.9)

    1、卸载原有系统上安装的cmake,便于安装更高版本的cmake。(如果不卸载系统自带的,直接安装,可能会出现错误。)
         apt-get autoremove cmake
    2、去官网下载cmake的最新版的安装包

       官网地址: https://cmake.org/download/   


    注:下载和自己的OS匹配的版本;
    3.将下载的安装包放到 /usr路径下,并且解压;
       tar zxvf cmake-2.8.9-Linux-i386.tar.gz
    4.到了这里,可以看一下解压以后的目录结构,看解压是否成功(某些时候,解压有可能出错,导致文件缺失)

     

    5、为cmake创建连接
         ln -s /usr/cmake-2.8.9-Linux-i386/bin/* /usr/bin/ 
    6、到这里,cmake就安装完成;
    7、验证cmake的安装是否成功;
    (1)cmake -version;

    (2)cmake -help;


    8、到这里,你的cmake 已经安装成功了;

    二、CMake的简单使用
    (一)对于单个文件下的CMake的使用
    1、创建 *.c或 *.cpp文件,并且在源文件的同级目录下创建CMakeLists.txt文件;

    注:在创建CMakeLists.txt文件时,切记不要写成CMakeList.txt哦,我就是由于这个问题,纠结了好久。
    2、编写*.c文件和CMakeLists.txt文件;
    hello.c


    CMakeLists.txt


    注:CMakeLists.txt中设计的cmake命令

    project(工程名称)
    project指令会自动创建两个变量:
    <projectname>_BINARY_DIR  (binary file save path)    
    <projectname>_SOURCE_DIR(source  code save path)
    创建的这两个变量,分别与系统中的PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR值相等;
    add_executable(A.exe,A.c)
    A.c的源文件生成A.exe的可执行文件

    3、在CMakeLists.txt目录下,创建一个build的文件夹;


    4.进入build目录下,执行cmake ..(..是代表CMakeLists.txt文件是在当前路径的上级目录)


    注:执行完cmake ..之后的目录结构


    5、输入make命令,执行上图中的Makefile文件,便可得到目标可执行文件hello;


    6、运行hello,便可以得到hello.c的执行结果;



    作者水平有限,如有问题请留言,谢谢!

    展开全文
  • CMake快速入门

    2020-01-06 10:40:42
    CMake 是一款跨平台的构建工具. 介绍CMake的基本用法 1 为什么要使用CMake, 了解cmake的运行原理 2 使用CMake编译可执行文件、库 3 编译结果的安装、测试
  • cmake 安装下载

    千次阅读 2019-01-07 13:47:43
    CMake CMake是一个工程文件生成工具。用户可以使用预定义好的CMake脚本,根据自己的选择(像是Visual Studio, Code::Blocks, Eclipse)生成不同IDE的工程文件。这允许我们从GLFW源码里创建一个Visual Studio 2015...

    CMake

    CMake是一个工程文件生成工具。用户可以使用预定义好的CMake脚本,根据自己的选择(像是Visual Studio, Code::Blocks, Eclipse)生成不同IDE的工程文件。这允许我们从GLFW源码里创建一个Visual Studio 2015工程文件,之后进行编译。首先,我们需要从下载安装CMake。

    下载地址:https://cmake.org/download/

    当CMake安装成功后,你可以选择从命令行或者GUI启动CMake,由于我不想让事情变得太过复杂,我们选择用GUI。CMake需要一个源代码目录和一个存放编译结果的目标文件目录。源代码目录我们选择GLFW的源代码的根目录,然后我们新建一个 build 文件夹,选中作为目标目录。

    在设置完源代码目录和目标目录之后,点击Configure(设置)按钮,让CMake读取设置和源代码。我们接下来需要选择工程的生成器,由于我们使用的是Visual Studio 2015,我们选择 Visual Studio 14 选项(因为Visual Studio 2015的内部版本号是14)。CMake会显示可选的编译选项用来配置最终生成的库。这里我们使用默认设置,并再次点击Configure(设置)按钮保存设置。保存之后,点击Generate(生成)按钮,生成的工程文件会在你的build文件夹中。

    编译

    build文件夹里可以找到GLFW.sln文件,用Visual Studio 2015打开。因为CMake已经配置好了项目,所以我们直接点击Build Solution(生成解决方案)按钮,然后编译的库glfw3.lib(注意我们用的是第3版)就会出现在src/Debug文件夹内。

    展开全文
  • CMake的安装及示例

    万次阅读 2019-06-04 20:54:56
    CMake的安装 一、下载 在linux环境下打开网页浏览器,输入网址:https://cmake.org/download/,找到最新版本的位置。一般开放源代码软件都会有两个版本发布:Source Distribution 和 Binary Distribution,前者是...
  • cmake详细教程

    2020-07-30 23:31:57
    简单到复杂的cmake编写教程,适合刚入们的新手。cmake 已经开发了 5,6 年的时间,如果没有 KDE4,也许不会有人或者 Linux 发行版 本重视 cmake,因为除了 Kitware 似乎没有人使用它。通过 KDE4
  • Linux下CMake简明教程

    万次阅读 多人点赞 2020-07-31 22:29:37
    CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,...
  • cmake快速入门

    万次阅读 多人点赞 2019-03-12 15:46:12
    1, cmake 的介绍,下载,安装和使用 2, cmake 的手册详解,我关注了 -C和-G 的使用 3, 在Linux中构建cmake 的工程 第一个问题: cmake 介绍,下载和安装以及使用:https://fukun.org/archives/0421949.html ...
  • CMake入门教程

    万次阅读 多人点赞 2019-01-05 20:06:30
    cmake的亮点在于编译复杂项目上的应用 —— cmake是一个跨平台的Makefile 生成工具! 一言以蔽之——cmake 为项目自动生成Makefile, 虽然cmake功能远不止步于此,但是本文聚焦于此。 例1:Hello World 源代码只有一个...
  • CMake进阶之CMake原理与关键概念

    千次阅读 多人点赞 2018-08-09 15:56:34
    上一篇文章中我们通过一个很简单的示例项目展示了CMake构建脚本CMakeFileLists.txt的构成,我们初步认识了CMake中的一些概念:target(目标)、command(命令)等等。这篇文章我们来学习一下CMake的原理,并详细阐述...
  • Mac 环境下 CMake 安装

    万次阅读 2017-12-10 20:21:08
    1、首先去cmake,官网,下载Mac操作系统对应的安装包https://cmake.org/download/2、在控制台输入 sudo “/Applications/CMake.app/Contents/bin/cmake-gui” –install3、输入 cmake –version 检查
  • cmake升级到cmake-3.9.2版本

    万次阅读 2017-09-17 13:47:31
    1、当前版本 2、获得到cmake-3.9.2源码 wget https://cmake.org/files/v3.9/cmake-3.9.2.tar.gz3、源码安装cd cmake-3.9.2 ./configure sudo make && make install
  • 这样的方式来让我们清除产生的缓存,但是它编译的缓存(*.cmake, Makefile,CmakeCache.txt, CMakeFiles目录)会遍布各个目录。 解决方法: 在根部目录下建立一个build目录,然后在build目录中编译即可。 #...
  • Centos7安装高版本Cmake

    万次阅读 2017-09-12 15:12:09
    下载Cmakewget ...解压Cmaketar xvf cmake-3.6.2.tar.gz && cd cmake-3.6.2/ 编译安装cmake./bootstrap gmake gmake install 查看编译后的cmake版本 /usr/local/bin/cmake --version 移除
  • Linux下安装cmake步骤详解(图文)

    万次阅读 多人点赞 2018-03-11 15:48:20
    1.查看Linux位数:#getconf LONG_BIT 2.获cmake源码包,这里我先新建一个文件夹来存放cmake# mkdir app# cd /app# wget ...解压源码包# tar xzvf cmake-3.3.2.tar.gz4.安装gcc等程序包(安装过则忽略)# yum ins...
  • centos7下升级cmake,很简单

    万次阅读 2018-07-25 11:36:46
    1.下载cmake(看看自己版本对不对)...tar xvf cmake-3.6.2.tar.gz && cd cmake-3.6.2/ ./bootstrap2.解压,编译安装gmakegmake install(需要在su命令下执行,或者直接使用root账户安装) 查看新版本/usr/l
  • ubuntu下cmake的GUI界面

    万次阅读 2017-01-06 18:39:16
    ubuntu下cmake3.4的安装(有GUI界面)
  • CMake 预编译宏定义

    万次阅读 2018-04-04 14:17:06
    在CMakeLists.txt 中添加,如要在原生代码区分Android与IOS平台的编译,可以这么做:
1 2 3 4 5 ... 20
收藏数 100,816
精华内容 40,326
关键字:

cmake