使用cmake将Eigen库添加到C++项目中

3
很遗憾,我在我的Ubuntu 18.04.4 LTS系统上使用Cmake将头文件Eigen 3.3.7 Library添加到Makefile时遇到了一些问题。 我可以通过将库文件夹复制到include目录中并在CMakeLists.txt文件中使用include_directories(./include/eigen3)来编译我的代码。 但是,我更希望不要硬编码库路径,而是能够在CMakeLists.txt文件中动态设置它,以使与他人共享项目变得更加容易。 不幸的是,我找到的所有说明都没有起作用。
我准备了以下最小代码示例:
main.cpp:
#include <eigen3/Eigen/Dense>
#include <iostream>

int main()
{  
    Eigen::Vector3d test_vec(1.0f, 2.0f, 3.0f);
    std::cout << test_vec << std::endl;
    return 0;
} 

CMakeLists.txt:

cmake_minimum_required(VERSION 3.0)

project(Eigen-Cmake-Test VERSION 1.0) # set the project name

find_package (Eigen3 3.3 REQUIRED NO_MODULE)

include_directories(${EIGEN_INCLUDE_DIR})

# add the executable
add_executable("${PROJECT_NAME}" ./main.cpp) 

target_link_libraries("${PROJECT_NAME}" Eigen3::Eigen)

我只下载了头文件Eigen 3.3.7库,并将文件夹重命名为eigen3。然后将该文件夹移动到: /usr/local/share/eigen3 当我运行cmake CMakeLists.txt时,出现以下错误:
CMake Error at CMakeLists.txt:5 (find_package):
  Could not find a package configuration file provided by "Eigen3" (requested
  version 3.3) with any of the following names:

    Eigen3Config.cmake
    eigen3-config.cmake

  Add the installation prefix of "Eigen3" to CMAKE_PREFIX_PATH or set
  "Eigen3_DIR" to a directory containing one of the above files.  If "Eigen3"
  provides a separate development package or SDK, be sure it has been
  installed.


-- Configuring incomplete, errors occurred!

当我检查Eigen库文件夹时,我发现/usr/local/share/eigen3/cmake只包含一个名为Eigen3Config.cmake.in的文件,而不是所需的Eigen3Config.cmake。为什么会这样?
我尝试将文件重命名为Eigen3Config.cmake,但出现了以下错误:
CMake Error at CMakeLists.txt:5 (find_package):
  Could not find a configuration file for package "Eigen3" that is compatible
  with requested version "3.3".

  The following configuration files were considered but not accepted:

    /usr/local/share/eigen3/cmake/Eigen3Config.cmake, version: unknown



-- Configuring incomplete, errors occurred!

此外,我还尝试了在stackoverflow: CMake find_package not working for Eigen?中解释的解决方案,但没有成功。
我该如何使它正常工作?我认为我还不太理解底层系统。任何解释都将不胜感激。

2
文件 Eigen3Config.cmake.in 是一个模板。当您构建项目时,文件 Eigen3Config.cmake.in 将被转换为可用的 Eigen3Config.cmake 文件。 - fdk1342
1
构建我的项目需要使用Eigen库,使用cmake时,上述错误意味着我需要已经存在Eigen3Config.cmake文件才能构建项目。如果我只能通过构建项目来生成该文件,那么这将会产生循环依赖,这让我有些困惑。或者你所说的构建项目是指什么? - Manumerous
为了更好地了解在C++中管理库的不同方法,以及它们的优缺点,我发现下面这篇文章非常有帮助,我想分享给大家:C++依赖管理的方法 - Manumerous
此外,我还发现以下关于如何使用CMake将不同类型的库添加到项目中的详细说明非常有帮助:教程:使用CMake和Git轻松管理C++依赖项 - Manumerous
1个回答

6
你遇到的问题是下载了Eigen源代码但没有实际构建项目。你可能认为它是一个仅包含头文件的库,因此没有构建步骤。但实际上有,它会构建“package config”(.pc)和Eigen3Config.cmake文件,其中一个您正在尝试使用。
根据我之前的评论,文件Eigen3Config.cmake.in是一个模板,将用于生成可用的Eigen3Config.cmake文件。
如果您坚持使用源代码中的,那么请先构建并安装它。或者,更简单的方法是安装libeigen3-dev软件包,它已经包含/usr/lib/cmake/eigen3/Eigen3Config.cmake如果您确实想要下载和安装源代码,请查看INSTALL文件,其中有一种“Method 2”的方法可以在cmake中使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接