cmake

作者: 菜菜子MJ | 来源:发表于2020-08-11 17:44 被阅读0次

    CMake是一个构建系统生成器

    常用内置关键字

    工程源目录和bin目录

    CMAKE_<LANG>_COMPILER 指定编译器名称,如C CXX,也可以通过环境变量指定,如env CXX=clang++ cmake ..
    PROJECT_SOURCE_DIR  顶级CMakeLists所在目录
    PROJECT_BINARY_DIR  cmake生成目录
    CMAKE_CURRENT_SOURCE_DIR  CMakeLists所在目录
    CMAKE_CURRENT_BINARY_DIR  工程文件所在目录
    CMAKE_CURRENT_LIST_FILE  引用这个变量所在文件的全路径
    CMAKE_CURRENT_LIST_DIR  引用这个变量所在文件的全目录
    CMAKE_CURRENT_LIST_LINE  引用这个变量所在文件行号
    CMAKE_HOST_SYSTEM_PROCESSOR cmake当前运行的主机系统CPU的名称,如i386”、“i686”、“x86_64”、“AMD64"
    CMAKE_SIZEOF_VOID_P void指针的大小,如8表示CPU是64位体系结构
    BUILD_SHARED_LIBS 如果为ON,则add_library默认创建共享库
    

    参考
    https://blog.csdn.net/fuyajun01/article/details/8911857

    常用指令

    # CMake 最低版本号要求
    cmake_minimum_required (VERSION 2.8)
    # c++标准,如98 11 14 17 20
    set(CMAKE_CXX_STANDARD 11)
    # 只启用ISO C++标准的编译器标志,而不使用特定编译器的扩展
    set(CMAKE_CXX_EXTENSIONS OFF)
    # ON时,如果指定的C++标准不可用,CMake将停止配置并出现错误,OFF时,如果标准不可用,可以降级处理
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    # 指定编译类型 Debug Release RelWithDebInfo MinSizeRel
    set(CMAKE_BUILD_TYPE DEBUG)
    # 指定编译选项
    set(CMAKE_C_FLAGS_DEBUG "-g -Wall")
    set(CMAKE_CXX_FLAGS_DEBUG "-g -Wall")
    # 查询系统信息,可以同时查询多个<key>,结果list保存在<variable>
    cmake_host_system_information(RESULT <variable> QUERY <key> ...)
    # 添加编译选项
    list(APPEND CMAKE_CXX_FLAGS "-fno-rtti" "-fno-exceptions")
    # 指定库类型,如果为false或未定义,将生成一个静态库(指定后可以不传递 STATIC/SHARED/OBJECT)
    set(BUILD_SHARED_LIBS OFF)
    # 项目信息和语言(语言可不填,默认启用C CXX)
    project(recipe-04 LANGUAGES CXX)
    project(<PROJECT-NAME>
            [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
            [DESCRIPTION <project-description-string>]
            [LANGUAGES <language-name>...])
    # 以选项的形式显示逻辑开关,设置其默认值为OFF
    option(USE_LIBRARY "Compile sources into a library" OFF)
    # 打印相关消息
    message(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}")
    message(FATAL "Do not support windows")
    

    其他模块指令

    include(CMakeDependentOption)
    # 定义依赖于其他选项的选项
    # 当USE_LIBRARY=ON时,MAKE_STATIC_LIBRARY=OFF,否则=ON,仅可以在USE_LIBRARY=ON时另外指定MAKE_STATIC_LIBRARY的值,否则指定无效
    cmake_dependent_option(
        MAKE_STATIC_LIBRARY "Compile sources into a static library" OFF
        "USE_LIBRARY" ON
        )
    
    include(CheckCXXCompilerFlag)
    # 检查编译器标志-march=native,变量_march_native_works存储检查结果(true或false)
    check_cxx_compiler_flag("-march=native" _march_native_works)
    
    include(FortranCInterface)
    # 验证Fortran和C/C++编译器是否能协同工作
    FortranCInterface_VERIFY(CXX)
    # 生成头文件,可以处理名称混乱
    FortranCInterface_HEADER(
      fc_mangle.h
      MACRO_NAMESPACE "FC_"
      SYMBOLS DSCAL DGESV
      )
    
    include(FindPkgConfig) # 或者使用 find_package(PkgConfig REQUIRED QUIET)
    # 检查包并使用第一个可用包
    pkg_search_module(
      ZeroMQ
      REQUIRED
        libzeromq libzmq lib0mq
      )
    # 判断是否找到
    if(TARGET PkgConfig::ZeroMQ)
      message(STATUS "Found ZeroMQ")
    endif()
    # 找到后会生成以下变量
    ZeroMQ_INCLUDE_DIRS 
    ZeroMQ_LIBRARY_DIRS
    ZeroMQ_LIBRARIES
    # 检查所有相应的包
    pkg_check_modules
    
    include(ExternalProject)
    
    

    全局指令

    # 设置全局编译定义
    add_definitions(-DIS_LINUX)
    # 添加子目录
    add_subdirectory(math)
    # 全局添加头文件路径
    include_directories("${PROJECT_SOURCE_DIR}/math")
    #生成静态链接库libbase.a
    add_library(base STATIC|SHARED|OBJECT base.cpp)         
    # 指定生成目标
    add_executable(demo main.cpp)
    # 查找依赖库,[QUIET]表示只有在没有找到pkg-config时,CMake才会报错
    find_package(<package> [version]  [REQUIRED])
    # 查找module
    
    

    局部指令

    # 遍历路径下的文件保存到DIR_SRCS变量
    aux_source_directory(${PROJECT_SOURCE_DIR}/src DIR_SRCS)
    # 添加链接库路径
    link_directories(/usr/local/lib)
    
    # 设置源文件属性
    set_source_files_properties(file PROPERTIES property value)
    # 设置目标属性
    set_target_properties(target1 target2 ...PROPERTIES prop1 value1 prop2 value2 ...)
    set_target_properties(animal-farm
      PROPERTIES
        CXX_STANDARD 14
        CXX_EXTENSIONS OFF
        CXX_STANDARD_REQUIRED ON
      )
    
    # 获取源文件属性保存到VAR变量
    get_source_file_property(VAR file property)
    
    # 设置目标编译选项,其中编译选项可以添加三个级别的可见性:INTERFACE、PUBLIC和PRIVATE
    target_compile_options(geometry
      PRIVATE
        ${flags}
      )
    # 设置目标编译定义
    target_compile_definitions(hello-world PUBLIC "IS_LINUX")
    # 为目标添加头文件路径
    target_include_directories(mylib PUBLIC ${PROJECT_SOURCE_DIR}/inlude)
    # 为目标添加源文件
    target_sources(<target>
      <INTERFACE|PUBLIC|PRIVATE> [items1...]
      [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
    # 将一个文件复制到另一个位置并修改@VAR@或${VAR}为当前值
    configure_file(<input> <output>
                   [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
                   [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
    # 添加链接库名称
    target_link_libraries(demo base)
    

    使用

     # 输出项目在CMake构建时,实际使用了哪些编译标志
    cmake --build . -- VERBOSE=1
    

    备注

    • anaconda环境下的cc为软连接,指向gcc, CMAKE_C_COMPILER默认为cc, CMAKE_CXX_COMPILER默认为c++
    # PRIVATE,编译选项会应用于给定的目标,不会传递给与目标相关的目标。即使compute-areas将链接到geometry库,compute-areas也不会继承geometry目标上设置的编译器选项。
    # INTERFACE,给定的编译选项将只应用于指定目标,并传递给与目标相关的目标。
    # PUBLIC,编译选项将应用于指定目标和使用它的目标。
    

    相关文章

      网友评论

          本文标题:cmake

          本文链接:https://www.haomeiwen.com/subject/xmmydktx.html