为何CMake中find_library(c c)无法设置变量c,但set()可以?
为什么find_library()无法设置变量
c,但set()可以? 这其实是CMake对系统核心库的特殊处理逻辑导致的,具体原因拆解如下:
- 首先,你要查找的
c是系统默认的C标准库(libc),链接器在编译C程序时会自动链接它,根本不需要显式指定路径。 - 当你调用
find_library(c c)时,CMake会识别出目标是C标准库,且变量名和库名完全一致。它会默认认为你只是想确认这个库是否存在,而非需要保存它的路径——毕竟链接器自己就能找到,没必要多此一举把路径存到变量里。所以CMake不会将搜索结果写入缓存变量c。 - 但当你用
find_library(a c)时,变量名a和库名c不重合,CMake会认为你可能需要这个库的路径做其他操作(比如打印路径、手动指定链接逻辑等),因此会正常将搜索到的libc路径存入缓存变量a。 - 而
set(c "text" CACHE STRING "")是直接操作CMake的缓存系统,完全不受find命令对系统库的特殊处理逻辑限制,所以能成功创建并设置缓存变量c。
总结来说:CMake对C标准库这类自动链接的核心库,在变量名与库名一致时会跳过缓存写入;而set命令是直接修改缓存,不受这个规则约束。
内容的提问来源于stack exchange,提问作者Tzalumen
相关产品推荐
相关产品推荐

