我目前正在尝试编写我的第一个非平凡的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:
我知道这是非常基本的,但是从我可以发现的所有教程中我都可以产生有用的输出。任何想法??
答案 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和犰狳,但这对我来说不是一个选择:(