我使用本征做一些矩阵运算,但是使用本征元的src文件的编译时间非常慢,我的意思是,当文件只有300行时,大约需要40多行。我只使用小于Matrix4f的矩阵,甚至不使用动态大小矩阵,只用于一些矩阵乘法和矩阵分解(SVD和FullPivLU)。
在我的另一个项目中,cpp文件是1000行,编译需要几分钟,输出的.so文件非常大,大约为100米。我必须打开-bigobj选项。
这在调试(我将优化设置为-O0)和发布(-O3)模式中都会发生。我尝试在标题中添加#define和EIGEN_NO_DEBUG,而不是帮助。
我在下面编写了这段非常小的代码test.cpp:
#include </home/user/mywork/software/eigen-3.3.9/Eigen/Dense>
#include "iostream"
using namespace std;
using namespace Eigen;
void test()
{
Matrix3f A;
A << 1,2,3,4,2,8,5,4,9;
BDCSVD<Matrix3f> svd(A, ComputeFullU | ComputeFullV);
Matrix3f U = svd.matrixU();
Matrix3f V = svd.matrixV();
cout << "------Eigen------" << endl;
cout << "A" << A << endl;
cout << "U" << U << endl;
cout << "V" << V << endl;
}
int main()
{
test();
return 0;
}编译命令
g++ test.cpp -o test_eigen它需要20多个编译,输出'test_eigen‘是5.6m!
我的os是ubuntu16.04,我使用cmake,在CMakelist中,只包含它的目录。特征版本为3.3.9。
有人有线索吗?非常感谢。
发布于 2022-01-07 05:16:24
特征由7.8MB的纯头文件组成。因此,任何.cpp,包括它,都将有一个困难的编译(使用千兆字节的内存和极慢)。此外,由于模板和内联函数的广泛使用,调试版本将非常缓慢,无法用于调试目的。(例如,谷歌的制图员 will 关于调试版本的警告)和我也是做了一些测试。
因此,我认为应将特征用于以下几个方面:
matrix_4x4.h、vector4.h、standard_deviation_calculaor.h等)只在.cpp文件中包含特征。公开的.h文件将非常简单,不会传播以减慢其他文件的编译速度。Matrix4x4::multiplyInplace(const Matrix4x4& r)将在.cpp中实现,并使用特征。https://stackoverflow.com/questions/67529835
复制相似问题