【问题标题】:Adding Eigen library to c++ project using cmake使用 cmake 将 Eigen 库添加到 c++ 项目
【发布时间】:2020-11-15 10:36:01
【问题描述】:

不幸的是,我在我的 Ubuntu 18.04.4 LTS 系统上使用 Cmake 将标头仅添加 Eigen 3.3.7 Library 到我的 Makefile 时遇到了一些问题。 我可以使用库编译我的代码,只需复制包含目录中的库文件夹并使用 include_directories(./include/eigen3) 在 CMakeLists.txt 文件中。但是,我更希望不对库路径进行硬编码,而是能够在 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 Library 并将文件夹重命名为 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? 解释的解决方案,但没有成功。

我怎样才能使它正常工作?另外我认为我还不太了解底层系统。任何解释将不胜感激。

【问题讨论】:

  • 文件Eigen3Config.cmake.in 是一个模板。当您构建项目时,文件Eigen3Config.cmake.in 将转换为Eigen3Config.cmake,然后就可以使用了。
  • 要构建我的项目,它使用 Eigen lib,使用 cmake 上面的错误意味着我已经需要 Eigen3Config.cmake 文件来构建项目。如果我只能通过构建将是循环依赖的项目来生成文件,这让我有点困惑。或者你说的构建项目到底是什么意思?
  • 为了更好地了解在 C++ 中管理库的不同方式及其优缺点,我发现以下帖子非常有帮助,我想分享:Approaches to C++ Dependency Management
  • 此外,我还发现以下关于如何使用 cmake 向项目添加不同库类型的详细说明非常有帮助:Tutorial: Easy dependency management for C++ with CMake and Git

标签: c++ cmake eigen header-only


【解决方案1】:

您遇到的问题是由下载 Eigen 源代码而不是实际构建项目引起的。您可能会认为,因为它是一个只有标头的库,所以没有构建步骤。嗯,有;它构建包配置.pcEigen3Config.cmake 文件。您正在尝试使用其中之一。

根据我之前的评论,文件 Eigen3Config.cmake.in 是一个模板,将用于生成 Eigen3Config.cmake,然后就可以使用了。

安装 libeigen3-dev 包可能更容易,它与/usr/lib/cmake/eigen3/Eigen3Config.cmake 打包在一起。如果您坚持使用源代码中的Eigen,则构建并安装它

如果您确实想下载并安装为源代码,可以查看INSTALL 文件,该文件有一个“方法 2”建议如何在 cmake 中使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2018-03-30
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多