[⑤CMake]: find_library使用

发布时间:2023年12月21日

前言

当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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。