find_package 和 find_library的区别

背景

经常看CMakeLists.txt中有find_package和find_library,有时候没留意以为都一样,其实二者差距比较大,下面简单记录一下。

find_package

find_package(NAME), 这段代码的本质就是在找一个NAME.cmake这个文件,一般在安装库的时候,会随行带一个文件NAME.cmake安装在系统的cmake文件里。这种一般是大型库会提供的基本文件,比如boost。比如CUDA, 会在cmake的share/cmake-version/Modules的路径下放一个FindCUDA.cmake(因为cuda使用很多,所以在cmake官网下载时候会默认包含这个FindCUDA.cmake文件,3.27后取消了这个,直接用enabel_language),如果查找不到,可以使用这个命令看看细节:cmake --debug-find …

find_library

find_library则是一个更加基本的方法,他不依赖库提供的cmake配置文件,而直接查找,需要作者自己去手动制定文件路经、头文件。

调用的作用是在${CUDA_TOOLKIT_ROOT_DIR}/lib64目录以及默认的库搜索路径中查找名为 libcudart 或 cudart 的库文件,并将找到的库文件的路径存储在 CUDA_NVRTC_LIB 变量中。
find_library(
  CUDART_LIBRARY cudart libcudart
  PATHS
  ${CUDA_TOOLKIT_ROOT_DIR}
  PATH_SUFFIXES
  lib64
  lib
  NO_DEFAULT_PATH
  )
//这时候环境里面还没有cudart这个target,只有CUDART_LIBRARY这个路径
if(NOT TARGET cudart AND CUDART_LIBRARY)

  add_library(cudart SHARED IMPORTED GLOBAL)
  //这时候环境里面会导入cudart这个target,但是还没有具体位置,可以理解为一个空壳子,但是必须给一个imported属性告诉cmake这个玩意是导入的,所以必须配合下面的set_property给出具体的导入位置,此外如果加入GLOBAL的属性,那么代表其作用于扩展至全工程
  add_library(nvidia::cudart ALIAS cudart)
  //又给这个库起了一个别名叫做nvidia::cudart
  set_property(TARGET cudart PROPERTY IMPORTED_LOCATION ${CUDART_LIBRARY})
  //这里就有具体的东西了

总结

参考

https://zhuanlan.zhihu.com/p/631259689

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值