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
测试某些 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