cmake

2020-08-11  本文已影响0人  菜菜子MJ

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

备注

# PRIVATE,编译选项会应用于给定的目标,不会传递给与目标相关的目标。即使compute-areas将链接到geometry库,compute-areas也不会继承geometry目标上设置的编译器选项。
# INTERFACE,给定的编译选项将只应用于指定目标,并传递给与目标相关的目标。
# PUBLIC,编译选项将应用于指定目标和使用它的目标。
上一篇下一篇

猜你喜欢

热点阅读