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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了'find_library'在CMake的循环中返回相同的值相关的知识,希望对你有一定的参考价值。

我正试图在CMake中循环一个包含库名的列表。在每次迭代中,我使用find_library搜索库:

set(LIB_NAMES "TKBO;TKBRep;")
set(LIBS_DIR /usr/local/OCCT/7.2.0/libd)


FOREACH(LIB_NAME ${LIB_NAMES})
  FIND_LIBRARY(LIB ${LIB_NAME} PATHS ${LIBS_DIR})
  MESSAGE("<<${LIB_NAME}>>")
  MESSAGE("<<${LIB}>>")
  target_link_libraries(mySharedLib ${LIB})
ENDFOREACH()

对于上面,我得到输出:

<<TKBO>>
<</usr/local/OCCT/7.2.0/libd/libTKBO.dylib>>
<<TKBRep>>
<</usr/local/OCCT/7.2.0/libd/libTKBO.dylib>>

当LIB_NAME更新时,FIND_LIBRARY似乎使用了过时的值。我也尝试在循环结束时明确地使用UNSET(LIB_NAME),但这也没有帮助。

我能俯瞰什么?

答案

find_library的结果是一个CACHED变量,一旦找到该库,该变量就不会更新。

搜索不同的库时,最好使用不同的结果变量:

FOREACH(LIB_NAME ${LIB_NAMES})
  set(LIB_VAR "LIB_${LIB_NAME}") # Name of the variable which stores result of the search
  FIND_LIBRARY(${LIB_VAR} ${LIB_NAME} PATHS ${LIBS_DIR})
  target_link_libraries(mySharedLib ${${LIB_VAR}})
ENDFOREACH()

这里LIB_TKBO变量用于TKBO库,LIB_TKBRep变量用于TKBRep库。

另一答案

解决方法:

UNSET(LIB_NAME CACHE)

有关类似问题,请参阅here

以上是关于'find_library'在CMake的循环中返回相同的值的主要内容,如果未能解决你的问题,请参考以下文章

Extjs GridPanel构造器参数意思

解决报错:OSError: Failed to open file b‘D:\xe5xadxa6xe4xb9xa0\scipy-_7cm39vc‘(图文并茂版详细版!!)

python3判断是字符串中包含某些特定字符

Apollo CM11 类未找到异常

编译cm11出错

Rmarkdown:输出pdf设置