5

我目前正在尝试编写我的第一个重要的 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:

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

4

2 回答 2

4

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

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

# Checks 'REQUIRED', '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 和犰狳,但这不是我的选择:(

于 2012-08-14T14:26:32.900 回答
3

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)
于 2012-08-13T17:44:09.160 回答