Eigen::VectorXd 构造函数在编译时需要 MatrixXd

Eigen::VectorXd constructor desires MatrixXd when compiling

测试某些 Eigen 功能时遇到一个简单的问题。我正在创建一个通过引用获取 3 Eigen::Vector 的构造函数。当我在 main 中构造这 3 个并调用 Interp 对象(我创建的 class )构造函数时,我得到构造函数需要 Eigen::MatrixXd (请参阅此问题底部的编译错误)。我的代码如下所示。我还没有添加太多功能,所以我会说这是一个非常简单的问题,但我自己找不到解决方案。

main.cpp

#include "Interp.hpp"

int main(){
    Eigen::VectorXd xData(4);
    xData << 0.0, 0.33, 0.66, 1.00;
    Eigen::VectorXd zData(4);
    zData << 0.0, 1.0, 0.5, 0.0;
    Eigen::VectorXd dzData(4);
    dzData << 0.0, 0.0, 0.0, 0.0;

    Interp obj(xData,zData,dzData);
}

Interp.hpp

#include <iostream>
#include <vector>
#include <eigen3/Eigen/Dense>

class Interp {
public:
    Interp(Eigen::VectorXd &xData, Eigen::VectorXd &zData, Eigen::VectorXd &dzData);
    void compute();
    double evaluate(double &x);
    Eigen::VectorXd evaluate(Eigen::VectorXd &x);

private:
    Eigen::VectorXd xData;
    Eigen::VectorXd zData;
    Eigen::VectorXd dzData;
    Eigen::MatrixXd xPoints;
    
    Eigen::VectorXd p;
    Eigen::MatrixXd A;
    Eigen::MatrixXd b;
};

Interp.cpp

#include "Interp.hpp"

Interp::Interp(Eigen::VectorXd &xData, Eigen::VectorXd &zData, Eigen::VectorXd &dzData){
    this->xData = xData;
    this->zData = zData;
    this->dzData = dzData;
    this->xPoints.resize(xData.size()-1,2);
}

我使用 CMake 构建,所以我的 CMakeLists.txt 文件是: CmakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(test1 VERSION 0.1.0)

include(CTest)
enable_testing()

find_package (Eigen3 3.3 REQUIRED NO_MODULE)

add_executable(test1 main.cpp)

target_link_libraries (test1 Eigen3::Eigen)


set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

我得到的输出如下:

[main] Building folder: test 
[build] Starting build
[proc] Executing command: /usr/bin/cmake --build /home/none/test/build --config Debug --target all -- -j 10
[build] Scanning dependencies of target test1
[build] [ 50%] Building CXX object CMakeFiles/test1.dir/main.cpp.o
[build] [100%] Linking CXX executable test1
[build] CMakeFiles/test1.dir/main.cpp.o: In function `main':
[build] /home/none/test/main.cpp:11: undefined reference to `Interp::Interp(Eigen::Matrix<double, -1, 1, 0, -1, 1>&, Eigen::Matrix<double, -1, 1, 0, -1, 1>&, Eigen::Matrix<double, -1, 1, 0, -1, 1>&)'
[build] collect2: error: ld returned 1 exit status
[build] CMakeFiles/test1.dir/build.make:94: recipe for target 'test1' failed
[build] make[2]: *** [test1] Error 1
[build] make[1]: *** [CMakeFiles/test1.dir/all] Error 2
[build] CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/test1.dir/all' failed
[build] Makefile:116: recipe for target 'all' failed
[build] make: *** [all] Error 2
[build] Build finished with exit code 2

在大致中间的位置,您会看到对 Matrix 构造函数的未定义引用。我知道 VectorXd 是 Matrix 的继承类型,但我没想到这会在调用构造函数时给我带来任何麻烦。毕竟还是自己的类型

这是一个非常简单的问题,但我不知道该怎么做。任何帮助将不胜感激。

有关答案,请在我最初的问题下方的评论中查看@rafix07:

“你没有编译

Interp.cpp

尝试

add_executable(test1 main.cpp interp.cpp)"

-- rafix07