cmake 本征 find_package 提示

cmake Eigen find_package HINTS

我需要将 Eigen 添加到我们的一个项目中。 由于 Eigen 是 header-only,我们决定将它直接放入我们的 source-code 目录以使用 Git 跟踪它,并确保在克隆存储库后一切就绪。 因此,我们从 here 下载了 Eigen 并将其放在我们项目目录中的目录 EIGEN 中。

我们在这个项目中使用 cmake。 我可以使用以下代码包含 Eigen:

find_package(Eigen3 REQUIRED)
if (Eigen3_FOUND)
    message("Eigen found")
    message("  Eigen location: ${Eigen3_DIR}")
    message("  Eigen Version: ${Eigen3_VERSION}")
    target_link_libraries (ourProject Eigen3::Eigen)
endif ()

但是,此代码确实在 /usr/local/share/eigen3/cmake 中找到了不同的 Eigen 版本。

我希望它使用位于 source-code 目录中的 Eigen 版本。 因此,我尝试使用 HINTS 选项:

find_package(Eigen3 REQUIRED HINTS ./EIGEN)

但它不起作用。 我的主要问题是我不知道我必须将哪条路径写入 HINTS。 EIGEN 目录包含多个其他文件夹。我尝试了其中一些但没有成功:

find_package(Eigen3 REQUIRED HINTS ./EIGEN/Eigen)
find_package(Eigen3 REQUIRED HINTS ./EIGEN/Eigen/src)
find_package(Eigen3 REQUIRED HINTS ./EIGEN/cmake)...

确保 cmake 使用我想要的 Eigen 版本的正确方法是什么?

就像评论中提到的 squareskittles 一样,您应该使用源代码树中 Eigen3 的位置来调用 add_subdirectory()。然后你不需要调用 find_package(),只要你只使用 Eigen3::Eigen 目标,因为这将由 Eigen3 CMake 脚本添加。

因此,如果您有以下源代码树:

- foo/
  - CMakeLists.txt    # Top-level CMakeLists file
  - eigen/            # Cloned Eigen repo
    - CMakeLists.txt
    - ...
  - foo.cpp
  - foo.hpp

您的 foo/CMakeLists.txt 应包含:

add_subdirectory(eigen)

不过要小心,如果不调用 find_package() - Eigen3_VERSIONEigen3_INCLUDE_DIR 可能无法设置某些 CMake 变量 例如。如果你决定调用 find_package() 来获取这些,你不需要给它一个 HINTS 参数,并且可以提供 CONFIG 或 NO_MODULE 直接进入配置模式。

然后 CMake 将搜索一个 Eigen3Config.cmake 而不是 FindEigen3.cmake,它将在Eigen 构建树。