• cmake总结


    无论生活还是工作上,做过的事,需要总结下。

    接触cmake,一般都会看一本书 <<cmake 实践>>. 这是cmake的入门书。我就不多说了。

    下面说一下我对部分cmake命令的使用与理解,不正确的,请大家指点,谢谢!

    1. 所有的注释,都以#开头。
    #XXX Build Script
    #CMakeLists.txt
    #
    #Copyright (c) 2011, L
    #All rights reserved.

    2. cmake版本的控制。
    cmake_minimum_required (VERSION 2.8)

    3. 定义项目名称。
    PROJECT (xxx)

    4. 如果想看到更多cmake编译时候的信息,置为ON,否则为OFF.
    set(CMAKE_VERBOSE_MAKEFILE ON)

    5. 在项目中,我们一般会用到一些第三方库。cmake支持一些,注意,只是部分。例如对Boost的支持,对apr的不支持。
    set(Boost_USE_STATIC_LIBS ON)
    set(Boost_USE_MULTITHREAD ON)
    find_package(Boost 1.4.3 REQUIRED)
    如果你的机器上装有Boost,它会自动找出来,找不出来,就会报错,停止编译。(REQUIRED的作用)

    在项目中,我们用到了apache runtime library(apr).cmake不支持,我的解决方法手动添加apr的路径。
    例如:
    #apr
    SET(APR_ROOT $ENV{APR_DIST})
    尝试写个.cmkae模块,用findXXX调用,但是不知道该如何如找apr的安装路径。有知道的朋友,希望指点,谢谢!
    找到Boost后,我们会自动得到它的include路径和lib路径。
    同时,我们可以得到一些库的名称。
    MESSAGE(STATUS "Boost include path:" ${Boost_INCLUDE_DIRS})
    MESSAGE(STATUS "Boost lib path:" ${Boost_LIBRARY_DIRS})

    FIND_PACKAGE(Boost REQUIRED COMPONENTS system)
    STRING(REPLACE "boost_system" "boost_regex" Boost_REGEX_LIBRARY ${Boost_SYSTEM_LIBRARY})
    STRING(REPLACE "boost_system" "boost_regex" Boost_REGEX_LIBRARY_DEBUG ${Boost_SYSTEM_LIBRARY_DEBUG})
    STRING(REPLACE "boost_system" "boost_regex" Boost_REGEX_LIBRARY_RELEASE ${Boost_SYSTEM_LIBRARY_RELEASE})

    6. 如果你的cmake实现中,用到了一些模块,例如*.cmake.这个时候,需要
    #set module path. for FindXXX.cmake
    SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})

    7. 创建宏。
    例如你建的工程是unicode 编码,可以这样:
    #set character set. unicode
    add_definitions(-DUNICODE -D_UNICODE)

    8.  添加子目录,它会去子目录中寻找CmakeLists.txt,然后执行它。
    ADD_SUBDIRECTORY(subdir)

    9. 将一个文件下的编译用的源文件添加到一个宏列表中。
    AUX_SOURCE_DIRECTORY(. SRC_LIST)
    注意,它只是将.cc .cpp .c的文件添加到SRC_LIST中,.h除外。

    10. 如果你想将.h文件也加进来,使用
    file (GLOB HEADERS "include/*.h")
    SET(SRC_LIST ${SRC_LIST} ${HEADERS})

    注意GLOB这个参数,它不支持子目录。如果你想让它支持子目录,用GLOB_RECURSE。
    在vs中可以创建子文件夹,这样会使我们的项目看上去美观,规范。
    cmake支持这一功能。
    source_group(Include\utils FILES ${HEADERS})
    这个可以亲自试试,看看效果。在使用这个命令的时候,本想用regex,正则来处理,试过了好几次,发现cmake好像不怎么支持正则,例如Perl的语法。
    例如:if(${f} MATCHES "(.*)(.h)$")
    如在这块有心得的朋友,希望指点下,哈哈。

    11. 头文件包含路径及库路径
    INCLUDE_DIRECTORIES
    link_directories

    12. 在windows+vs中,如果我们想改变项目的输出路径,dll, .lib,需要
    IF(MSVC)
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/lib )
    ELSE(MSVC)
    set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin )
    set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib )
    ENDIF(MSVC)

    13. 检查一个文件或目录是否存在,用
    if(NOT EXISTS ${APR_ROOT})
    endif()
    注意这里的if,是小写的,用大写的,就会报错,为此,我折腾了半天。

    14. cmake提供了gui界面。如果想使用界面方式,例如:设置变量MY_ROOT的值
    SET(MY_ROOT "/usr/lib" CACHE PATH "my root path")
    记得不要加FORCE。加上了,会rebuild,不是我们想要的效果。

    好了,希望对用得到的朋友,有所帮助。谢谢!

  • 相关阅读:
    Markdown文字添加颜色
    深度学习基础——感知机
    Markdown插入表格语法
    卷积神经网络CNN学习笔记
    python 安装离线库
    无法定位程序输入点到xxx.dll
    XMind配置防火墙
    简书 markdown 代码高亮标记
    clion ctrl+鼠标左键不能调到函数实现
    D
  • 原文地址:https://www.cnblogs.com/lidabo/p/3961921.html
Copyright © 2020-2023  润新知