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
相关产品推荐
相关产品推荐

