背景
经常看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
724

被折叠的 条评论
为什么被折叠?



