CMAKE 常用指令

来源:互联网 发布:编程就业方向 编辑:程序博客网 时间:2024/05/19 20:20

CMAKE 常用指令

介绍

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。

构建过程

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

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

举个栗子

  1. CMakeLists.txt 文件:
PROJECT(proj)CMAKE_MINIMUM_REQUIRED(VERSION 2.6)cmake_policy(SET CMP0015 NEW)ADD_SUBDIRECTORY()## 设置编译选项SET(CMAKE_CXX_FLAGS " -g -Wall -std=c++11 ")## 设置变量SET(PROTOBUF /usr/local/include)SET(BOOST_DIR /root/usr/)## include路径INCLUDE_DIRECTORIES(../../include ${BOOST_DIR}/include  ${PROTOBUF})## 链接库路径LINK_DIRECTORIES(../../lib/ /usr/local/lib/ ${BOOST_DIR}/lib ${PROTOBUF}/lib)## 设置要编译的源文件SET(SOURCE_FILES main.cpp config.cpp)## 作用是发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表。AUX_SOURCE_DIRECTORY(. SOURCE_FILES)## 生成可执行文件ADD_EXECUTABLE(proj ${SOURCE_FILES})## 链接库TARGET_LINK_LIBRARIES(proj protobuf boost_system boost_thread)## 存放路径SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../../../bin/)## 输出详细过程#set(CMAKE_VERBOSE_MAKEFILE ON)
  1. 执行cmake:
    “`
    [root build]# cmake ..
    – The C compiler identification is GNU 4.8.5
    – The CXX compiler identification is GNU 4.8.5
    – 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
    – 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: /data/test/build

  2. 执行make

cmake常用指令说明

  1. 指定工程名

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

  2. 设置自定义变量

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

  3. 输出打印信息

    MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display”…)

  4. 输出可执行文件

    ADD_EXECUTABLE(hello ${SRC_LIST})

  5. 变量名格式 : 在本例我们使用了cmakeIF使{},指令是大小写无关的,参数和变量是大小写相关的。但,推荐你全部使用大写指令。

  6. 添加子目录:

    ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

  7. 指定最终目标二进制的位置:

    SET(EXECUTABLE_OUTPUT_PATH PROJECTBINARYDIR/bin)SET(LIBRARYOUTPUTPATH{PROJECT_BINARY_DIR}/lib)

  8. 生成静态库或动态库:

    ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

  9. 设置目标库的属性:

    如设置输出名: SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME “hello”)

  10. 获取目标库的属性:

    GET_TARGET_PROPERTY(VAR target property) GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME)

  11. 头文件搜寻路径:

    INCLUDE_DIRECTORIES(/usr/include/hello)

  12. 添加需要链接的共享库:

    TARGET_LINK_LIBRARIES(main hello)
    TARGET_LINK_LIBRARIES(main libhello.a)

  13. 把整个目录下的文件名放到一个变量里:

    AUX_SOURCE_DIRECTORY(. SOURCE_FILES)

  14. 如果你需要看到make构建的详细过程,可以使用make VERBOSE=1或者VERBOSE=1 make命令来进行构建。

    set(CMAKE_VERBOSE_MAKEFILE ON)

  15. cmake 常用常量

    • CMAKE_BINARY_DIR、PROJECT_BINARY_DIR、_BINARY_DIR:这三个变量指代的内容是一致的,如果是 in source 编译,指得就是工程顶层目录如果是 out-of-source 编译,指的是工程编译发生的目录。
    • CMAKE_SOURCE_DIR、PROJECT_SOURCE_DIR、_SOURCE_DIR:这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录。也就是在 in source 编译时,他跟 CMAKE_BINARY_DIR 等变量一致。
    • CMAKE_CURRENT_SOURCE_DIR:指的是当前处理的 CMakeLists.txt 所在的路径
    • CMAKE_CURRRENT_BINARY_DIR:如果是 in-source 编译,它跟 CMAKE_CURRENT_SOURCE_DIR 一致,如果是 out-ofsource 编译,他指的是 target 编译目录。
    • EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH:分别用来重新定义最终结果的存放目录,前面我们已经提到了这两个变量。
    • PROJECT_NAME:返回通过 PROJECT 指令定义的项目名称。

参考资料

  • 最为详细的pdf文档:http://sewm.pku.edu.cn/src/paradise/reference/CMake%20Practice.pdf
0 0