CMake之常用模块


我们承担ROS,FastDDS等通信中间件,C++,cmake等技术的项目开发和专业指导和培训,有10年+相关工作经验,质量有保证,如有需要请私信联系。

本文主要总结cmake中常用到的模块。可以通过cmake --help-module <module_name>查看帮助

CheckCXXSourceCompiles

检查是否C++源码编译和链接到可执行文件中,CXX可以为C,Fortran等语言
check_cxx_source_compiles

check_cxx_source_compiles(<code> <resultVar>
                          [FAIL_REGEX <regex1> [<regex2>...]])

CheckCXXCompilerFlag

检查CXX编译器是否支持给定的flag
check_cxx_compiler_flag(<flag> <var>) 检查flag是否被编译器支持,检查结果将保存在缓存变量var中

CMakePrintHelpers

用于调试,定义了两个函数用来打印属性和变量

cmake_print_properties([TARGETS target1 ..  targetN]
                      [SOURCES source1 .. sourceN]
                      [DIRECTORIES dir1 .. dirN]
                      [TESTS test1 .. testN]
                      [CACHE_ENTRIES entry1 .. entryN]
                      PROPERTIES prop1 .. propN )

用于打印指定文件的属性

cmake_print_variables(var1 var2 ..  varN)

用于打印给定变量的变量值,通过下面示例看使用场景:

include(CMakePrintHelpers)
file(GLOB DEPEND_SRC ${GMOCK_TEST_SRC}/*.cc)
foreach(var ${DEPEND_SRC})
    cmake_print_variables(${var})  # 这里的意图是打印出有哪些.cc文件
endforeach()

foreach(var a b c d)
    cmake_print_variables(${var})
endforeach()

set(d 10)
set(e "hello")
set(f 12.3)
foreach(var d e f)
    cmake_print_variables(${var})
endforeach()

target_sources(
    mock_lib
    PUBLIC
    ${DEPEND_SRC}
)

在这里插入图片描述

GNUInstallDirs

定义了GNU标准安装目录,包含以下变量:

  • CMAKE_INSTALL_<dir> :文件安装的目的目录,这个值通常是由install命令的DESTINATION使用的
  • CMAKE_INSTALL_FULL_<dir> :对应于CMAKE_INSTALL_<dir>的绝对路径。
    其中,<dir>为以下值:
    • BINDIR:定义用户可执行文件所在的子目录,即所选安装目录下的bin目录,自验证值为bin
    • SBINDIR:目标代码库所在的子目录,lib或lib64,自验证值为lib
    • LIBEXECDIR
    • SYSCONFDIR
    • SHAREDSTATEDIR
    • LOCALSTATEDIR
    • RUNSTATEDIR
    • LIBDIR:库,lib或lib64
    • INCLUDEDIR:C头文件,该变量为include
      验证如下:
include(GNUInstallDirs)
message(STATUS "CMAKE_INSTALL_LIBDIR is: ${CMAKE_INSTALL_LIBDIR}")
message(STATUS "CMAKE_INSTALL_BINDIR is: ${CMAKE_INSTALL_BINDIR}")
message(STATUS "CMAKE_INSTALL_INCLUDEDIR is: ${CMAKE_INSTALL_INCLUDEDIR}")

message(STATUS "CMAKE_INSTALL_FULL_LIBDIR is: ${CMAKE_INSTALL_FULL_LIBDIR}")
message(STATUS "CMAKE_INSTALL_FULL_BINDIR is: ${CMAKE_INSTALL_FULL_BINDIR}")
message(STATUS "CMAKE_INSTALL_FULL_INCLUDEDIR is: ${CMAKE_INSTALL_FULL_INCLUDEDIR}")

输出:
在这里插入图片描述
从输出中可以看到,安装路径都是在usr/local下(如果是相对路径,默认前缀就是usr/local),这样的话直接安装会报权限不足。所以需要自己指定前缀

GenerateExportHeader

用于为库生成导出宏的函数,提供了GENERATE_EXPORT_HEADER()

GENERATE_EXPORT_HEADER( LIBRARY_TARGET
          [BASE_NAME <base_name>] # 设置生成的头文件和宏的名称(好像没啥用)
          [EXPORT_MACRO_NAME <export_macro_name>] # 设置导出宏的名称
          [EXPORT_FILE_NAME <export_file_name>] # 导出文件名及目录
          [DEPRECATED_MACRO_NAME <deprecated_macro_name>] # 弃用宏的名称
          [NO_EXPORT_MACRO_NAME <no_export_macro_name>] # 不导出宏的名称
          [INCLUDE_GUARD_NAME <include_guard_name>]
          [STATIC_DEFINE <static_define>] # 定义宏的名称
          [NO_DEPRECATED_MACRO_NAME <no_deprecated_macro_name>] # 设置宏的名称,在编译时将将要废弃的代码排除在外
          [DEFINE_NO_DEPRECATED] # 指示CMake生成预处理代码,以从编译中排除将要废弃的代码
          [PREFIX_NAME <prefix_name>]
          [CUSTOM_CONTENT_FROM_VARIABLE <variable>]
)

为适合预处理器生成一个文件,该文件包含在类库中使用的导出宏

CMakeDependentOption

cmake_dependent_option(<option> "<help_text>" <value> <depends> <force>) 用来定义依赖于其他选项的选项
当depends为true时,option是有效的,<help_text> 和初始值<value>可以使用;如果depends是无效的,option不可用且值为<force>

CMakePackageConfigHelpers

提供帮助函数,用来创建配置文件

  1. 创建配置文件:configure_package_config_file
configure_package_config_file(<input> <output>
  INSTALL_DESTINATION <path>
  [PATH_VARS <var1> <var2> ... <varN>]
  [NO_SET_AND_CHECK_MACRO]
  [NO_CHECK_REQUIRED_COMPONENTS_MACRO]
  [INSTALL_PREFIX <path>]
  )
  1. 创建版本文件
write_basic_package_version_file(<filename>
  [VERSION <major.minor.patch>]
  COMPATIBILITY <AnyNewerVersion|SameMajorVersion|SameMinorVersion|ExactVersion>
  [ARCH_INDEPENDENT] )
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
有三种方法可以使用cmake来编译内核模块。 第一种方法是在cmake中使用add_custom_command和add_custom_target来实现编译。具体思路是将makefile中的obj-m和ALL伪目标以及make等操作都放到cmake中执行。 第二种方法是保留makefile,在cmake中使用cmake支持的make命令,并指定执行make的目录名称。 第三种方法是在cmake文件中指定内核源代码的路径,然后使用cmake的命令来编译驱动或其他内核模块。 以上是三种常用的在cmake中编译内核模块的方法。您可以根据具体情况选择其中的一种来使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [使用cmake编译内核模块的几种方法](https://blog.csdn.net/jinking01/article/details/128345501)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [cmake(10):使用cmake编译linux驱动或内核模块](https://blog.csdn.net/rangfei/article/details/119352372)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值