【cmake篇】自定义cmake模块(自定义Findxxx.cmake并搭配 find 您所在的位置:网站首页 如何自己编写指数 【cmake篇】自定义cmake模块(自定义Findxxx.cmake并搭配 find

【cmake篇】自定义cmake模块(自定义Findxxx.cmake并搭配 find

2024-07-14 14:25| 来源: 网络整理| 查看: 265

这里所说的自定义cmake模块,可以简单理解为自定义 Findxxx.cmake 或者 XXXConfig.cmake 文件,然后可以搭配find_package 来一次引入模块中涉及的所有内容。

如果不熟悉find_path、find_library,可以参考:find_path、find_library

如果不熟悉find_package 的两种检索模式,可以参考:find_package 详解

         目录

1、编写Findxxx.cmake

(1) 获取头文件路径

(2) 获取库文件(含全路径)

(3) 设置控制变量 XXX_FOUND

(4) 完整FindAdd.cmake 

2、搭配 find_package 引入自定义cmake模块

(1) 添加检索路径

(2) 查找模块文件 FindAdd.cmake

(3) 判断是否引入

(4) 完整CMakeLists.txt 写法

1、编写Findxxx.cmake

Findxxx.cmake 支持 CMakeLists.txt 所使用的语法,但无法主动通过命令执行,find_package 匹配了自己所需的模块后,会自动执行 Findxxx.cmake。

Findxxx.cmake 的作用:

获取头文件所在路径获取库文件全路径自定义控制变量,如 XXX_FOUND 可以用于判断是否成功引入模块(是否获取到了头文件路径和库文件全路径) ... ...

下面我们要引入的头文件是 gather.h、mul.h 和库文件 libmul.so 。生成的模块是FindAdd.cmake(模块名称是Add) 

(1) 获取头文件路径

因为find_path 每次都会将命令的执行结果,这里就是 头文件路径缓存到 CMakeCache.txt 文件中,所以每次查找前最好清空一下缓存。

unset(INCLUDE_DIR CACHE) # 清空缓存 find_path(INCLUDE_DIR # 查找头文件,并将路径添加到变量 INCLUDE_DIR NAMES gather.h HINTS ${PROJECT_SOURCE_DIR}/vac/util ${PROJECT_SOURCE_DIR}/app1 ) list(APPEND Add_INCLUDE_DIR ${INCLUDE_DIR}) # Add_INCLUDE_DIR 汇总头文件路径 unset(INCLUDE_DIR CACHE) find_path(INCLUDE_DIR NAMES mul.h HINTS ${PROJECT_SOURCE_DIR}/vac/util ${PROJECT_SOURCE_DIR}/app1 ) list(APPEND Add_INCLUDE_DIR ${INCLUDE_DIR})

(2) 获取库文件(含全路径)

find_library 也是如此,会将命令的执行结果缓存到 CMakeCache.txt 文件,所以每次查找前最好清空一下缓存。

unset(LIBS CACHE) # 清空缓存 find_library(LIBS # 查找库文件,并将包含全路径的库文件保存到变量 LIBS 中 NAMES mul HINTS ${PROJECT_SOURCE_DIR}/build/lib ) list(APPEND Add_LIBRARIES ${LIBS}) # 汇总库文件名称

 

(3) 设置控制变量 XXX_FOUND

设置此控制变量的目的是方便判断是否找到了当前 Add 模块。 

if (Add_INCLUDE_DIR AND Add_LIBRARIES) set(Add_FOUND TRUE) endif (Add_INCLUDE_DIR AND Add_LIBRARIES)

(4) 完整FindAdd.cmake  unset(INCLUDE_DIR CACHE) find_path(INCLUDE_DIR NAMES gather.h HINTS ${PROJECT_SOURCE_DIR}/vac/util ${PROJECT_SOURCE_DIR}/app1 ) list(APPEND Add_INCLUDE_DIR ${INCLUDE_DIR}) unset(INCLUDE_DIR CACHE) find_path(INCLUDE_DIR NAMES mul.h HINTS ${PROJECT_SOURCE_DIR}/vac/util ${PROJECT_SOURCE_DIR}/app1 ) list(APPEND Add_INCLUDE_DIR ${INCLUDE_DIR}) unset(LIBS CACHE) find_library(LIBS NAMES mul HINTS ${PROJECT_SOURCE_DIR}/build/lib ) list(APPEND Add_LIBRARIES ${LIBS}) if (Add_INCLUDE_DIR AND Add_LIBRARIES) set(Add_FOUND TRUE) endif (Add_INCLUDE_DIR AND Add_LIBRARIES)

2、搭配 find_package 引入自定义cmake模块

接下来我们要通过在 CMakeLists.txt 中配置,来引入自定义的cmake模块 

(1) 添加检索路径

find_package有两种检索模式,不同模式下的检索路径也不相同,上面我们自定义的 FindAdd.cmake 属于模块模式,使用的检索路径为 CMAKE_MODULE_PATH

set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)

ps: 上面定义的FindAdd.cmake 文件放在了 ${PROJECT_SOURCE_DIR}/cmake 目录下

(2) 查找模块文件 FindAdd.cmake # MODULE 表示仅使用模块模式,不使用配置模式 find_package(Add REQUIRED MODULE)

(3) 判断是否引入 add_executable(${PROJECT_NAME} test.cpp vac/util/mul.h) if(Add_FOUND) include_directories(${Add_INCLUDE_DIR}) # Add_INCLUDE_DIR是FindAdd.cmake中定义的变量 target_link_libraries(${PROJECT_NAME} ${Add_LIBRARIES}) # Add_LIBRARIES 也是如此 endif(Add_FOUND)

(4) 完整CMakeLists.txt 写法 cmake_minimum_required(VERSION 3.0) project(tool_test) list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) find_package(Add REQUIRED MODULE) add_executable(${PROJECT_NAME} test.cpp vac/util/mul.h) if(Add_FOUND) include_directories(${Add_INCLUDE_DIR}) target_link_libraries(${PROJECT_NAME} ${Add_LIBRARIES}) endif(Add_FOUND)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有