【发布时间】:2015-11-04 21:39:27
【问题描述】:
我正在尝试安装两个项目:Foo 和 NeedsFoo。我已经使用 cmake 成功编译并在本地安装了 Foo。但是,我在服务器上,cmake 似乎没有“记住” Foo 的位置。
在 cmake 中配置 NeedsFoo 我有
list(APPEND CMAKE_MODULE_PATH "<prefix>/foo-install/CMake/FOO") # add path to FOOConfig.cmake
find_package(FOO REQUIRED)
if( FOO_FOUND )
MESSAGE(STATUS "Found FOO!")
endif( FOO_FOUND )
MESSAGE(STATUS ${FOO_INCLUDE_DIRS})
“找到 Foo!”已打印 --- 所以 cmake 找到 FOO --- 但变量 ${FOO_INCLUDE_DIRS} 为空,因此,包无法编译。有什么想法吗?
编辑:服务器上似乎安装了另一个 Foo 副本。不幸的是,我不能使用它(它是我们项目的“主”分支,我需要使用我自己的分支)。我尝试将 find_package 调用更改为
find_package(FOO REQUIRED PATHS "<prefix>/foo-install/CMake/Foo" NO_DEFAULT_PATH)
但这并没有解决问题。
【问题讨论】:
-
CMAKE_MODULE_PATH影响find_package的module 模式:用于查找FindFoo.cmake。这就是为什么您的第一种方法不起作用的原因。但是你的第二种方法应该有效。您是否尝试过干净的配置(使用空的构建目录)?在这样的构建之后,Foo_DIR包含什么缓存条目? (缓存的变量在CMakeCache.txt中列出)。 -
第二种干净构建的方法奏效了……不知道为什么
-
问题是变量
Foo_FOUND、Foo_DIR和其他一些变量被缓存。所以第二次运行find_package()不会更新它们。 CMake 很常见 - 如果某些事情没有按预期工作,那么清理构建目录并重新运行 cmake。