[⑤CMake]: find_library使用
2023-12-21 14:29:52
前言
当CMake项目构建依赖于第三方库/系统库(静态库/动态库),可以使用find_library命令来查找并使用库。命令的格式可以参考官方网站:https://cmake.org/cmake/help/latest/command/find_library.html。
find_library (
<VAR>
name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
[HINTS [path | ENV var]... ]
[PATHS [path | ENV var]... ]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[VALIDATOR function]
[DOC "cache documentation string"]
[NO_CACHE]
[REQUIRED]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[NO_CMAKE_INSTALL_PREFIX]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
参数解析:
- <VAR> 用于储存命令的执行结果。如果库被找到,那么<VAR>就会返回库的路径(包含库名称),如果没有找到,返回<VAR>-NOTFOUND。 一旦find_library成功执行,<VAR>值不为<VAR>-NOTFOUND,那么接下来再次调用find_library,<VAR>不会被刷新,除非<VAR>的内容被清除。
- NAMES,指定待查找的可能库名称,库名称可以使用全称,也可以不带前缀(例如前缀lib)和后缀(例如后缀.so, .a)。虽然这里可以给多个库名称,但是只会匹配查找一个库。
- HINTS, PATHS, 指定除默认路径外库的查找的路径(默认搜索路径包含CMake定义的一些变量,例如CMAKE_LIBRARY_ARCHITECTURE、CMAKE_PREFIX_PATH。系统默认的库安装路径,例如/usr、/usr/lib等)。使用ENV var从系统环境变量中读取一个路径。
- PATH_SUFFIXES, 为每个搜索目录添加变量PATH_SUFFIXES指定的后缀目录。
- VALIDATOR, 在CMake版本version 3.25后支持,如果库被找到,调用指定的function()。
- DOC, 如果<VAR>是 cache entry,指定 cache entry的<docstring>。
- NO_CACHE, 在CMake版本version 3.21后支持,将<VAR>变量当成一个普通变量而不是一个cache entry。<VAR>默认是cache entry,就跟上面提到的一样,find_library命令只要检查到<VAR>有值(<VAR>不为空,且不为<VAR>-NOTFOUND),是不会再次执行实际查找库的动作。
- REQUIRED, 在CMake版本version 3.18后支持,指定该选项后,当find_library命令找不到库时会输出一条错误消息并终止CMake处理过程。
- NO_XXX_PATH,在搜索库时会忽略选项指定的搜索路径,例如指定NO_DEFAULT_PATH ,除了HINTS, PATHS中的路径,其他搜索路径都会被忽略。
下面为一个样例,在/usr/lib/syst下搜索libsyst.so库,并且将搜索到的库链接到main.c中。
unset(LIB_SYST CACHE)
find_library(
LIB_SYST
NAMES libsyst.so
PATHS /usr/lib/syst
NO_DEFAULT_PATH
)
target_link_libraries(main.c ${LIB_SYST})
find_package与find_library有类似的功能,使用的场景略有不同,find_library主要用于查找单个库文件。find_package用于查找复杂的第三方软件包,这些软件包通常包含多个库和头文件。
文章来源:https://blog.csdn.net/Eng_ingLi/article/details/135126561
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!