【问题标题】:CMake find_package() cannot find include dirsCMake find_package() 找不到包含目录
【发布时间】: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。

标签: c++ cmake


【解决方案1】:

确保已安装标头,通常您需要安装 -dev 或 -devel 包来获取标头。如果它们已安装并且您可以在系统中看到它们,则它们可能位于 cmake 不期望的路径上。打开 findFoo.cmake 文件(在 Linux 上,这通常位于 /usr/share/c make-x.y/modules 中)并检查预期位置列表,看看您是否安装在不太常规的位置。

【讨论】:

  • /usr/share/cmake-xy/modules 中似乎没有“FindFoo.cmake”文件 --- 尽管有很多其他“Find*.cmake”对应于其他程序(Matlab、MPI、Git 等)
  • 你能告诉我 Foo 在你的场景中实际上是什么吗?
猜你喜欢
  • 2016-01-19
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 2022-12-29
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
相关资源
最近更新 更多