You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake中find_library在循环中返回相同值的问题

CMake循环中find_library返回重复值的解决方案

这个问题我之前也碰到过,核心原因是CMake的find_library命令自带缓存机制:当你在循环里反复使用同一个变量名(比如这里的LIB)接收查找结果时,第一次查找完成后,CMake就会把这个变量的值缓存起来。后续迭代执行find_library时,它会直接读取缓存值,不会再去实际查找新的库,这就导致所有迭代都返回第一次的结果。

下面给你两种可行的解决办法:

方法一:使用唯一变量名存储每个库的路径

这是更推荐的方式,每个库用带有自身名称前缀的变量来存储路径,从根源上避免缓存冲突,代码可读性也更好:

set(LIB_NAMES "TKBO;TKBRep;")
set(LIBS_DIR /usr/local/OCCT/7.2.0/libd)
FOREACH(LIB_NAME ${LIB_NAMES})
    # 用LIB_${LIB_NAME}作为唯一变量名,确保每个库的路径独立存储
    FIND_LIBRARY(LIB_${LIB_NAME} ${LIB_NAME} PATHS ${LIBS_DIR})
    MESSAGE("<<${LIB_NAME}>>")
    MESSAGE("<<${LIB_${LIB_NAME}}>>")
    target_link_libraries(mySharedLib ${LIB_${LIB_NAME}})
ENDFOREACH()

方法二:每次查找前清除变量缓存

如果你坚持要使用同一个变量名,可以在每次执行find_library前,用unset命令清除该变量的缓存,强制CMake重新执行查找:

set(LIB_NAMES "TKBO;TKBRep;")
set(LIBS_DIR /usr/local/OCCT/7.2.0/libd)
FOREACH(LIB_NAME ${LIB_NAMES})
    # 清除LIB变量的缓存,确保下一次find_library会重新查找
    unset(LIB CACHE)
    FIND_LIBRARY(LIB ${LIB_NAME} PATHS ${LIBS_DIR})
    MESSAGE("<<${LIB_NAME}>>")
    MESSAGE("<<${LIB}>>")
    target_link_libraries(mySharedLib ${LIB})
ENDFOREACH()

两种方法都能解决你的问题,但方法一的代码结构更清晰,后续如果需要单独引用某个库的路径也更方便,建议优先采用。

内容的提问来源于stack exchange,提问作者newkid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:41:52