2016-04-21 223 views
1

我使用list来存储库的名称,并且我想使用foreachfind_library来查找每个库的完整路径。但是find_library刚刚返回了第一个库的路径。我查了this post,但问题依然存在。我的CMake版本是3.4.3。CMake使用foreach和find_library返回库的完整路径

SET(VTKLIBS_DIR) 

FOREACH(LIB ${VTKLIBS}) 
     SET(FOUND_LIB) 
     FIND_LIBRARY(FOUND_LIB ${LIB}) 
     LIST(APPEND VTKLIBS_DIR ${FOUND_LIB}) 
     MESSAGE("Lib: ${LIB}") 
     MESSAGE("Found Lib: ${FOUND_LIB}") 
     UNSET(FOUND_LIB) 
ENDFOREACH(LIB) 
+0

我找到了一个解决方案来解决这个问题,'UNSET(FOUND_LIB CACHE)'工作。 –

+1

你最好只为每个库使用不同的变量名称。 – arrowd

回答

2

命令find_library缓存变量,但命令unset只删除简单变量定义的简单形式。

正如您所提供的链接注意,你需要存储特殊价值FOUND_LIB-NOTFOUND给变量FOUND_LIB为力find_library寻找另一个库,而变量已经包含了以前的库路径:

FOREACH(LIB ${VTKLIBS}) 
     SET(FOUND_LIB "FOUND_LIB-NOTFOUND") 
     FIND_LIBRARY(FOUND_LIB ${LIB}) 
     LIST(APPEND VTKLIBS_DIR ${FOUND_LIB}) 
     MESSAGE("Lib: ${LIB}") 
     MESSAGE("Found Lib: ${FOUND_LIB}") 
ENDFOREACH(LIB) 

其实,这是一种伎俩,因为缓存了变量FOUND_LIB没有被简单的set命令改变。但是当find_library实现尝试读取变量的缓存值时,它实际上读取的值为简单的变量名称相同。

由于find_library仅将*-NOTFOUND缓存的值视为“未找到库”,所以向变量分配空值的技巧不起作用。

更好的方法,如@arrowd指出,将使用变量不同的名称,在不同的find_library()调用中使用:

FOREACH(LIB ${VTKLIBS}) 
     FIND_LIBRARY(FOUND_LIB_${LIB} ${LIB}) 
     LIST(APPEND VTKLIBS_DIR ${FOUND_LIB_${LIB}}) 
     MESSAGE("Lib: ${LIB}") 
     MESSAGE("Found Lib: ${FOUND_LIB_${LIB}}") 
ENDFOREACH(LIB) 

这样的结果,每find_library调用方式将分开存放,并在下一次调用cmake时,不会再次搜索相同的库。此外,这种方法允许用户修改(在缓存中)到具体库的路径而不影响其他路径。

+0

对于为每个变量使用不同名称的建议+1,它允许循环*和*使缓存工作 –