C++ cmake Eigen查找包提示

C++ cmake Eigen查找包提示,c++,cmake,eigen,C++,Cmake,Eigen,我需要添加到我们的一个项目中。 由于Eigen只是头文件,所以我们决定将它直接放在源代码目录中,用Git跟踪它,并确保在克隆存储库时一切就绪。 因此,我们从下载了Eigen,并将其放在项目目录中的目录Eigen 我们正在本项目中使用cmake。 我可以使用以下代码包含Eigen: find_package(Eigen3 REQUIRED) if (Eigen3_FOUND) message("Eigen found") message(" Eigen location: ${E

我需要添加到我们的一个项目中。 由于Eigen只是头文件,所以我们决定将它直接放在源代码目录中,用Git跟踪它,并确保在克隆存储库时一切就绪。 因此,我们从下载了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版本

我希望它使用位于源代码目录中的Eigen版本。
因此,我尝试使用
提示
选项:

find_package(Eigen3 REQUIRED HINTS ./EIGEN)
但它不起作用。 我的主要问题是,我不知道我必须在提示中写入哪条路径。 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一样,您应该调用
add_subdirectory()
,并在源代码树中指定Eigen3的位置。这样,您就不需要调用
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\u package()
-Eigen3\u VERSION和Eigen3\u INCLUDE\u DIR,可能无法设置某些CMake变量。如果您决定调用
find_package()
来获取这些,则不需要给它一个提示参数,并且可以提供CONFIG或NO_模块直接进入配置模式


然后,CMake将搜索一个特征3Config.CMake,而不是将在特征构建树中生成的FindEigen3.CMake

您是否考虑过使用
添加子目录(Eigen)
查找特征回购?“因此,我尝试使用提示选项……但它不起作用。”-描述“它不起作用”不是很有帮助。您在这次尝试中观察到了什么?是
查找包的结果没有更改?还是CMake发出了错误?@Tsyvarev它不会更改所选的本征版本。如果通过
添加子目录()添加本征,它总是选择
/usr/local/share/eigen3/CMake
版本
,本征源基本上是您当前项目(以及当前CMake调用)的一部分,本征目标/变量可以正确引用。在这种情况下,您不需要
find\u package()
完全正确吗?@squareskittles您确实正确。无论您是否调用
find_package()
,都将添加
Eigen3::Eigen
目标。但是在“非现代”中“CMake在我们使用
include\u directories
和_include\u DIR的地方,这不起作用,因为在根据我目前看到的处理*Config.CMake文件之前,不会添加此变量。我将编辑答案。@Pesho\T我试图使用
add\u subdirectoy()
,但没有成功。我试过这样做:
add_子目录(EIGEN/EIGEN)
并得到以下错误消息:在EIGEN/EIGEN/CMakeLists.txt:1(include):include找不到加载文件:RegexUtils…@user7431005您是否有一个与您添加的CMakeLists.txt文件相同目录级别的EIGEN目录
add_子目录()
to,它是否包含包含CMakeLists.txt文件的本征目录?检查一下有问题的命令和我的最新编辑,希望这足以让你去。