zoukankan      html  css  js  c++  java
  • CMake简易入门

    使用CMake编译

    CMake工具用于生成Makefile文件。用户通过编写CMakeLists.txt文件,描述构建过程(编译、连接、测试、打包),之后通过解析该文件,生成目标平台的Makefile文件,做到"Write once, run everywhere"。

       

    使用CMake的方法很简单:

    cmake <projectPath>

    确保projectPath目录下,有CMakeLists.txt文件。该文件当然是用户来编写,所以重点是编写CMakeLists.txt,语法可以参考《CMake 入门实战》,或者官方入门文档:

    https://cmake.org/cmake-tutorial/

    PS:在Windows下使用时,需要使用VS自带的命令行,不然会找不到cl工具的错误。

       

    成功执行cmake命令后,目录下会生成Makefile文件,不同编译平台生成的文件不同,编译工具也不同。

    • 如果是构建平台是MinGW,会什么makefile文件,使用mingw32-make构建。
    • 如果构建平台是VS系列,会生成vcxproj文件,可以使用msbuild工具构建。
    • 如果构造平台是NMake,可以使用nmake构建。

    可以使用以下命令编译:

    cmake --build <CMakeCachePath> --target <ProjectName>

    CMakeCachePath是指CMakeCache.txt(或CMakeFiles文件夹)所在的路径。

       

    可以使用以下命令清理编译结果:

    cmake --build <CMakeCachePath> --target clean

       

    如果CMakeLists.txt文件有修改,再次执行cmake命令,会更新Makefile文件。

       

    关于编译平台的选择

    可以使用以下命令,查看cmake支持的构建工具:

    cmake -G

       

       

    在生成Makefile时,指定构建工具:

    cmake -G "<generator>" <projectPath>

    generator可以是等号左边的名字。

       

    例如,在Windows下,默认生成vcxproj文件(cmake 3.13.0-rc3 + VS2017),如果希望使用nmake构建,可以使用以下命令:

    cmake -G "NMake Makefiles" <projectPath>

       

    关于清理生存文件

    存在一个问题,没找到较好的解决方案,如何清理CMake产生的文件?

    A:可以使用"-B"参数指定生成目录,这样CMake生成的文件都会集中在这个文件,例如:

    cmake -B <buildPath> .

    之后在编译操作,均要在buildPath文件夹下执行。

    特别的,还可以使用"-S"参数指定源码所在的文件夹,源码文件夹必须包含CMakeLists.txt。

    详情可以参考:

    https://cmake.org/cmake/help/v3.13/manual/cmake.1.html

    CMakeLists.txt编写入门

    可以使用Qt Creator新建一个CMake工程,每次修改后CmakeLists.txt文件后,可以在"General Messages"窗口,查看输出内容。

       

    基础

    CMakeLists.txt由命令构造成,每条命令占一行,换行符结尾,命令的格式如下:

    commandName(arg1 arg2 …)

    命令名不区分大小写参数间使用空格分隔

       

    在CMakeLists.txt中,字符串同C语言中一样,使用双引号包含

       

    输出

    使用message()命令,输出信息,至少接受两个参数:

    第一个参数指定信息的等级,为空的时候为重要信息,通常使用"STATUS"作为参数,代表该信息为普通说明信息。

    第二个参数为一个字符串,可以跟随多个字符串。

    例如:

    message(STATUS "Hello World")

       

    变量

    使用set()命令,自定义变量,至少接受两个参数,第一个参数为变量名,第二个参数为变量的值。参数如果多于2个,那么该变量为一个集合。

    特别的,可以使用以下命令设置系统环境变量:

    set(ENV{<variable>} <value>...)

       

    访问变量的格式如下:

    ${<variable>}

    访问系统环境变量需要以下格式:

    $ENV{<variable>}

       

    CMake内置了许多变量,可以参考:

    https://cmake.org/cmake/help/v3.13/manual/cmake-variables.7.html

       

    常用的有:

    PROJECT_NAME

    项目名

    PROJECT_BINARY_DIR

    项目编译输出路径,调用cmake命令时,使用"-B"参数指定,默认为CMakeLists.txt所在的文件。

    PROJECT_SOURCE_DIR

    项目源码路径,调用cmake命令时,使用"-S"参数指定,默认为CMakeLists.txt所在的文件。

    CMAKE_DEBUG_POSTFIX

    CMAKE_RELEASE_POSTFIX

    Debug/Release版的动态库后缀

    CMAKE_BUILD_TYPE

    编译类型(Debug、Release),该变量默认为空值

    内置变量可以在调用cmake命令时,使用"-D"参数设置:

       

    例子

    推荐使用以下命令编译,这样生成的文件集中在build文件夹下,不会污染源码文件夹。

    #cd进入CMakeLists.txt所在的文件夹

    cmake -B .uild .

    cmake --build .uild --target <ProjectName>

     

    生成可执行文件

    # 指定cmake最低版本

    cmake_minimum_required(VERSION 2.8)

       

    # 指定项目名

    project(CppDemo)

    # 生成可执行文件,第一个参数为目标名,之后参数为源文件列表

    add_executable(${PROJECT_NAME} "main.cpp")

       

    生成动态库

    cmake_minimum_required(VERSION 2.8)

    project(HelloWorld)

       

    # 添加头文件

    include_directories($ENV{JAVA_HOME}/include $ENV{JAVA_HOME}/include/win32)

       

    # 设置生成目录

    SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR})

       

    # 生成链接库文件,三个参数分别是链接库名、链接库类型、源码文件

    add_library(${PROJECT_NAME} SHARED HelloWorld.cpp)

  • 相关阅读:
    怎么重新启动网卡
    @JsonProperty的使用
    JAVA中的反射机制
    spring的IOC入门案例
    spring的IOC底层原理
    maven+Spring环境搭建
    SpringMVC与Struts2区别与比较总结
    Struts2面试题
    oracle自增序列创建
    Hibernate分页查询报错
  • 原文地址:https://www.cnblogs.com/foundkey/p/10213450.html
Copyright © 2011-2022 走看看