zoukankan      html  css  js  c++  java
  • cmake(转载)

    http://blog.csdn.net/jonathan321/article/details/51987416

    CMake 使用方法


    CMake的所有的语句都写在一个叫:CMakeLists.txt 的文件中。当CMakeLists.txt文件确定后,可以用ccmake命令对相关 的变量值进行配置。这个命令必须指向CMakeLists.txt所在的目录。配置完成之后,应用cmake命令生成相应的makefile(在Unix like系统下)或者 project文件(指定用window下的相应编程工具编译时)。需要为任何子目录建立一个CMakeLists.txt

    其基本操作流程为:

    ccmake directory
    cmake directory
    cmake -DCMAKE_BUILD_TYPE=Debug/Release directory
    make

    其中,directory为CMakeLists.txt所在目录,Makefile等文件的生成目录为cmake执行目录:

    • 第一条语句用于配置编译选项,如VTK_DIR目录,一般这一步不需要配置,直接执行第二条语句即可,但当出现错误时,这里就需要认为配置了,这一步才真正派上用场;
    • 第二条命令用于根据CMakeLists.txt生成Makefile文件;
    • 三条命令用于执行Makefile文件,编译程序,生成可执行文件。

    注:为了方便描述,下面的文件目录按照以下规则:

    工程顶层目录:/cmake
    in source编译下:工程编译发生目录为/cmake
    out of source编译下:工程编译目录为/cmake/build
    源文件所在目录为:/cmake/src
    二进制文件目录:/cmake/build/bin

    Cmake目录规则


    |----build/builds
    |     |----cmake
    |     |----mingw32
    |     |----msvc
    |     |----redhat
    |     |----valgrind
    |     |----zos
    |----common
    |----config
    |----debug
    |----doc
    |----include
    |----release
    |----src
    |----tests
    |----tools
    |----utils
    |--- AUTHORS
    |--- autogen.bat/sh
    |--- CMakeLists.txt
    |--- COPYING
    |--- INSTALL
    |--- MAINTAINERS
    |--- NEWS
    |--- README.md

    CMake常用变量和环境变量


    工程顶层目录/cmake

    CMAKE_SOURCE_DIR
    PROJECT_SOURCE_DIR
    <projectname>_SOURCE_DIR
    
    // 以下环境变量在in source编译情况下为工程顶层目录
    CMAKE_BINARY_DIR
    PROJECT_BINARY_DIR
    <projectname>_BINARY_DIR

    工程构建目录/cmake/build

    //out of source编译情况下
    CMAKE_BINARY_DIR
    PROJECT_BINARY_DIR
    <projectname>_BINARY_DIR

    与当前Cmake或二进制相关

    CMAKE_CURRENT_SOURCE_DIR //当前处理的 CMakeLists.txt 所在的路径。例如源文件所在目录/cmake/src
    
    //如果是in source编译,就是工程顶层目录/cmake
    //如果是out of source编译,就是target编译目录(/cmake/build/bin),可以使用ADD_SUBDIRECTORY(src bin)来更改这个值。
    CMAKE_CURRRENT_BINARY_DIR

    输出相关

    EXECUTABLE_OUTPUT_PATH
    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    
    LIBRARY_OUTPUT_PATH
    SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
    • EXECUTABLE_OUTPUT_PATH表示最终的目标二进制的位置;
    • LIBRARY_OUTPUT_PATH表示最终的共享库。
    • 在哪里ADD_EXECUTABLE或ADD_LIBRARY,如果需要改变目标存放路径,就在哪里加入上述的定义。

    PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR

    PROJECT_SOURCE_DIR为工程所在目录;PROJECT_BINARY_DIR为编译发生的当前目录,也就是make的执行目录。

    CMake指令


    CMAKE_MINIMUM_REQUIRED

    CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

    option指令

    PROJECT指令

    PROJECT(projectname [CXX] [C] [Java])
    示例:PROJECT (HELLO CXX)

    用来定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言。

    这个指令隐式的定义了两个cmake变量:<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR。cmake系统也帮助我们预定义了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量,他们的值分别跟 <projectname>_BINARY_DIR与 <projectname>_SOURCE_DIR 一致。建议使用PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR。

    SET指令

    SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
    示例:SET(SRC_LIST main.cpp t1.cpp t2.cpp)

    MESSAGE指令

    MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
    示例:MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

    用于向终端输出用户定义的信息,包含三种类型:

    • SEND_ERROR,产生错误,生成过程被跳过。
    • SATUS,输出前缀为—的信息。
    • FATAL_ERROR,立即终止所有 cmake 过程.。

    ADD_EXECUTABLE指令

    ADD_EXECUTABLE(demo ${SRC_LIST})
    ADD_EXECUTABLE(demo main.cpp t1.cpp t2.cpp)

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

    ADD_LIBRARY指令

    ADD_LIBRARY(libname [SHARED|STATIC|MODULE][EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
    • SHARED:动态库
    • STATIC:静态库
    • MODULE:在使用dyld的系统有效,如果不支持dyld,则被当做SHARED对待
    • EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。

    SET_TARGET_PROPERTIES指令

    SET_TARGET_PROPERTIES(target1 target2 ...PROPERTIES prop1 value1prop2 value2 ...)

    用来设置输出的名称,对于动态库,还可以用来指定动态库版本和 API 版本。

    INSTALL指令

    INSTALL(TARGETS myrun mylib mystaticlib
         RUNTIME DESTINATION bin
         LIBRARY DESTINATION lib
         ARCHIVE DESTINATION libstatic
    )
    • 可执行二进制myrun安装到${CMAKE_INSTALL_PREFIX}/bin目录
    • 动态库libmylib安装到${CMAKE_INSTALL_PREFIX}/lib目录
    • 静态库libmystaticlib安装到${CMAKE_INSTALL_PREFIX}/libstatic目录

    CMake使用


    自定义Makefile目标

    运行下面的代码,会先创建一个./debug目录,然后拷贝file.dll到./debug目录。

    add_custom_command(
        OUTPUT ./debug/file.dll
        COMMAND mkdir -p ./debug
                cp ./file.dll ./debug
        DEPENDS ./file.dll
    )
    add_custom_target(dlltest DEPENDS ./debug/file.dll)
    
    add_executable(demo ${SRC_LIST})
    add_dependencies(demo dlltest )
  • 相关阅读:
    软件工程第1次阅读作业
    软件工程第0次作业
    OO第四次博客
    OO第三次总结
    OO第二次总结
    OO第一次总结
    提问回顾与个人总结
    结对项目:最长单词链
    第一次阅读作业
    第四次博客
  • 原文地址:https://www.cnblogs.com/banwhui/p/7049000.html
Copyright © 2011-2022 走看看