背景

经常看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 …
如果在非标准路径下: 可以设置export Qt5_DIR=/path/share/cmake 或-DQt5_DIR=”C:/Program Files/Qt5.12.1/lib/cmake/Qt5”也是可以的

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐