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_VERSION 和 Eigen3_INCLUDE_DIR 可能无法设置某些 CMake 变量 例如。如果你决定调用 find_package()
来获取这些,你不需要给它一个 HINTS 参数,并且可以提供 CONFIG 或 NO_MODULE 直接进入配置模式。
然后 CMake 将搜索一个 Eigen3Config.cmake 而不是 FindEigen3.cmake,它将在Eigen 构建树。
我需要将 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_VERSION 和 Eigen3_INCLUDE_DIR 可能无法设置某些 CMake 变量 例如。如果你决定调用 find_package()
来获取这些,你不需要给它一个 HINTS 参数,并且可以提供 CONFIG 或 NO_MODULE 直接进入配置模式。
然后 CMake 将搜索一个 Eigen3Config.cmake 而不是 FindEigen3.cmake,它将在Eigen 构建树。