所以我正在编写一个CMake模块来查找一些在我们公司中被大量使用的库。这些库都有不同的版本,这里很乱。在某个库中,即使头文件和二进制文件的名称也不匹配。所以我正在编写一个CMake脚本来处理一劳永逸地找到每个库的所有问题。我的想法是写一些类似于我们如何找到boost包的东西,但也包括每个组件的版本。像这样:
find_package(OrgName COMPONENTS librarya-1.4.3 libraryb-2.3.1 libraryc-3.6.0)
所以我创建了一个FindOrgName.cmake
文件并迭代了所请求的组件,然后我处理了传递的字符串并获得了库名以及它的版本信息(更别说include和binary之间的区别)文件):
IF(OrgName_FIND_COMPONENTS)
FOREACH(comp ${OrgName_FIND_COMPONENTS})
SET(OrgName_${comp}_FOUND 0)
STRING(FIND ${comp} "-" dashind REVERSE)
STRING(LENGTH ${comp} length)
STRING(SUBSTRING ${comp} 0 ${dashind} name)
MATH(EXPR s "${dashind}+1")
MATH(EXPR l "${length}-${dashind}-1")
STRING(SUBSTRING ${comp} ${s} ${l} version)
SET(OrgName_${name}_INCLUDE_DIR "/usr/local/include/OrgName/${comp}/")
find_library(OrgName_${comp}_LIBRARIES NAMES "${comp}" HINTS "/usr/lib")
IF(OrgName_${comp}_INCLUDE_DIR AND OrgName_${comp}_LIBRARIES)
SET(OrgName_${comp}_FOUND 1)
ENDIF()
IF(NOT OrgName_${comp}_FOUND AND OrgName_FIND_REQUIRED_${comp})
MESSAGE(FATAL_ERROR "OrgName ${comp} not available.")
ENDIF()
SET (OrgName_INCLUDE_DIR ${OrgName_INCLUDE_DIR} ${OrgName_${comp}_INCLUDE_DIR})
SET (OrgName_LIBRARIES ${OrgName_LIBRARIES} ${OrgName_${comp}_LIBRARIES})
ENDFOREACH()
ENDIF()
现在问题就在这里,想象有人没有在组件名称中输入版本部分。我想搜索他已安装的版本(假设库的路径始终相同)并使用它可以找到的最后一个版本,因此我必须搜索其名称包含库名称的文件($ {name })。首先,我该怎么做?第二,我做得对吗?我的意思是有更简单的方法来完成这项任务吗?
答案 0 :(得分:0)
好的,经过大量的搜索和疲惫,我终于找到了解决方案。我只需要使用以下命令:
file(GLOB files "Mylib*")
这将创建一个名为files的列表,并将其名称与模式“Mylib *”匹配的每个文件添加到其中。我真的不知道为什么他们没有在find_file命令中实现它,但没关系,我会把它放在这里,万一有人像我一样感到困惑。