[⑤CMake]: find_library使用

前言

当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用于查找复杂的第三方软件包,这些软件包通常包含多个库和头文件。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李71~李先森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值