Unix运维_CMake教程_CMake中的include指令和.cmake文件

Unix运维_CMake教程_CMake中的include指令和.cmake文件

CMake 的构建系统是通过一个高度抽象的目标集合进行组织的。集合中的每个目标要么对应一个可执行文件或库, 要么包含了自定义的命令行。构建系统根据目标之间的依赖关系确定目标的构建顺序和生成规则。

CMakeLists.txt 文件

而 CMakeLists.txt 是 CMake 配置项目的构建系统, 配合使用 cmake 命令行工具生成构建系统并执行编译、测试, 相比于手动编写构建系统 (如 Makefile) 要高效许多。

.cmake 文件

在 /usr/local/share/cmake-3.xx/Modules 中会看到 大量 .cmake 文件。特别是 find_package 指令会用到的 FindX11.camke 等文件, 其实 .cmake 文件是一个模块文件, 可以被 include 到 CMakeLists.txt 中。

以 freeGLUT 3.4.0 的 CMakeLists.txt 文件为例

txt 复制代码
INCLUDE(CheckIncludeFiles)
IF(UNIX AND NOT(ANDROID OR BLACKBERRY OR FREEGLUT_WAYLAND))
    FIND_PACKAGE(X11 REQUIRED)
    INCLUDE_DIRECTORIES(${X11_X11_INCLUDE_PATH})
    LIST(APPEND LIBS ${X11_X11_LIB})
    IF(X11_Xrandr_FOUND)
        SET(HAVE_X11_EXTENSIONS_XRANDR_H TRUE)
        LIST(APPEND LIBS ${X11_Xrandr_LIB})
    ENDIF()
    IF(X11_xf86vmode_FOUND)
        SET(HAVE_X11_EXTENSIONS_XF86VMODE_H TRUE)
        LIST(APPEND LIBS ${X11_Xxf86vm_LIB})
    ENDIF()
    IF(X11_Xinput_FOUND)
        # Needed for multi-touch:
        CHECK_INCLUDE_FILES("${X11_Xinput_INCLUDE_PATH}/X11/extensions/XInput2.h" HAVE_X11_EXTENSIONS_XINPUT2_H)
        LIST(APPEND LIBS ${X11_Xinput_LIB})
    ELSE()
        MESSAGE(FATAL_ERROR "Missing X11's XInput2.h (X11/extensions/XInput2.h)")
    ENDIF()
ENDIF()

# FreeBSD and NetBSD joystick code uses libusbhid
IF(CMAKE_SYSTEM_NAME STREQUAL FreeBSD OR CMAKE_SYSTEM_NAME STREQUAL NetBSD)
    IF(HAVE_USBHID_H)
        LIST(APPEND LIBS "-lusbhid")
    ENDIF()
ENDIF()

指令解释: INCLUDE(CheckIncludeFiles)

其中的 INCLUDE(CheckIncludeFiles) 意为引入一个模块, 这个模块名为 CheckIncludeFiles , 包含了用于检查引入文件的一些函数。

指令解释: FIND_PACKAGE(X11 REQUIRED)

其中的 FIND_PACKAGE(X11 REQUIRED) 意为查找软件包, 而 X11 REQUIRED 代表查找 X11 的相关信息被请求了, 将会调用 /usr/local/share/cmake-3.xx/Modules 目录下的 FindX11.camke 模块, 这样就能够使用 FindX11.camke 模块中定义的查找路径 (包括可能存在的安装目录 .h 头文件路径和 .so 库文件路径)。

总结

以上就是关于 Unix运维 CMake教程 CMake中的include指令和.cmake文件 的全部内容。

更多内容可以访问我的代码仓库:

https://gitee.com/goufeng928/public

https://github.com/goufeng928/public

相关推荐
韩楚风2 分钟前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
陈苏同学6 分钟前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
Pythonliu728 分钟前
茴香豆 + Qwen-7B-Chat-Int8
linux·运维·服务器
你疯了抱抱我29 分钟前
【RockyLinux 9.4】安装 NVIDIA 驱动,改变分辨率,避坑版本。(CentOS 系列也能用)
linux·运维·centos
我是哈哈hh44 分钟前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝
郭二哈1 小时前
C++——模板进阶、继承
java·服务器·c++
挥剑决浮云 -1 小时前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记
立秋67891 小时前
Python的defaultdict详解
服务器·windows·python
Lansonli2 小时前
云原生(四十一) | 阿里云ECS服务器介绍
服务器·阿里云·云原生
小O_好好学2 小时前
CentOS 7文件系统
linux·运维·centos