find_package深度解析及实例应用
发布网友
发布时间:2024-09-25 23:58
我来回答
共1个回答
热心网友
时间:2024-11-14 08:01
在查找模式中,CMake使用两种主要模式:mole和config。
在mole模式下,CMake查找名为find.cmake的文件。首先在CMAKE_MODULE_PATH指定的路径中查找,随后在cmake安装时生成的查找模块中搜索。找到后会检查版本,并生成相关信息。
config模式下,CMake查找名为-config.cmake(-config.cmake)或Config.cmake的文件,如果提供了版本信息,则还会搜索名为-config-version.cmake或ConfigVersion.cmake的版本文件。config模式的搜索路径更为复杂,包括CMAKE_FIND_PACKAGE_REDIRECTS_DIR指定的路径,以及一系列优先级逐步递减的目录,如安装目录、特定cmake缓存变量指定的路径、cmake环境变量、系统平台文件中定义的cmake变量、用户自定义路径等。
在config模式中,还会有版本配置文件参与,用于校验与指定版本兼容的包。这些文件能被CMakePackageConfigHelpers模块辅助创建。
CMake会解析version参数,并根据范围或单一版本号来查找兼容的包。查找后,会生成一系列反映包版本信息的变量,如全版本、主版本、次版本等。若版本校验通过,会设置相应的_VERSION变量,供后续使用。
find_package命令支持多种格式和选项,如version(用于指定兼容版本),EXACT(要求精确匹配),MODULE(仅使用mole模式),QUIET(禁用信息消息),REQUIRED(找不到包时停止处理),COMPONENTS(指定组件列表),OPTIONAL_COMPONENTS(允许某些组件不存在),以及NAMES(使用特定名称查找包)等。
find_package的实例应用可以用于引用外部自定义库。例如,创建一个包含库文件和头文件的目录结构,然后编写FindAdd.cmake文件以支持find_package函数。在CMakeLists.txt中调用find_package函数即可完成查找和引用。
CMake还支持查找自带的内部依赖库,只需直接调用find_package函数即可。若需引用非内部库,如grpc,需先使用cmake方式编译安装,然后通过find_package进行查找。
此外,CMake提供了config模式的查找功能,允许开发者自定义查找策略和搜索路径,增加查找的灵活性和控制。