CMake的FIND_PACKAGE没有设置变量

时间:2012-08-13 17:07:36

标签: cmake

我目前正在尝试编写我的第一个非平凡的CMake项目,但我无法检查任何FIND_PACKAGE()的输出,因为它似乎没有将值归因于我期望的全局变量!例如,以下代码:

MESSAGE("CMake version: ${CMAKE_VERSION}")
FIND_PACKAGE(Armadillo)
IF(Armadillo_FOUND)
    MESSAGE("Found Armadillo.")
    MESSAGE("Armadillo include dir is: ${ARMADILLO_INCLUDE_DIR}")
    MESSAGE("Armadillo lib's to be linked against: ${Armadillo_LIBRARIES}")
    MESSAGE("Armadillo lib version: ${PACKAGE_FIND_VERSION}")
ENDIF(Armadillo_FOUND)

产生以下终端输出

/build]$ CMake version: 2.6.4
/build]$ Found Armadillo.
/build]$ Armadillo include dir is:
/build]$ Armadillo lib's to be linked against:
/build]$ Armadillo lib version:

我知道这是非常基本的,但是从我可以发现的所有教程中我都可以产生有用的输出。任何想法??

2 个答案:

答案 0 :(得分:2)

FindArmadillo.cmake中有这条评论:

# The following variables are set when ARMADILLO is found:
#  HAVE_ARMADILLO       = Set to true, if all components of ARMADILLO have been
#                         found.
#  ARMADILLO_INCLUDES   = Include path for the header files of ARMADILLO
#  ARMADILLO_LIBRARIES  = Link these to use ARMADILLO
#  ARMADILLO_LFLAGS     = Linker flags (optional)

答案 1 :(得分:2)

感谢arrowdodger,您的回答很有帮助,但这不是问题所在。问题是在完成FIND_PACKAGE(Armadillo)后,这些变量都没有设置(甚至不是ARMADILLO_FOUND)变量。 Armadillo_FOUND(注释小写)变量已设置,并且似乎由FIND_PACKAGE()函数而不是cmake模块文件设置。

将模块文件复制到我的目录并使用INCLUDE()命令而不是FIND_PACKAGE()命令调用它后,我能够找到问题。它似乎与使用cmake 2.6.4和Armadillo 2.2.3(两个过时的版本,但我受限于我们的系统分布式构建到这些)有关。因为我安装了Armadillo并且Find_PACKAGE()似乎检测到了这一点(将Armadillo_FOUND设置为true)但是,模块文件中的以下行失败(并且注意到这样做):

# Checks 'RECQUIRED', 'QUIET' and versions.
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Armadillo
  REQUIRED_VARS ARMADILLO_LIBRARY ARMADILLO_INCLUDE_DIR
  VERSION_VAR ARMADILLO_VERSION_STRING)
# version_var fails with cmake < 2.8.4

FIND_PACKAGE()似乎没有在此行失败,并且如上所述,FIND_PACKAGE()将Armadillo_FOUND设置为true,但由于此失败,模块文件中设置的所有变量都不会传播回CMakeLists.txt文件。从上面的列表中删除VERSION_VAR修复了该问题。当然更好的解决方法是更新cmake和犰狳,但这对我来说不是一个选择:(