我想基于Eigen的一般特征值求解器(Eigen 3.3.3)编译以下示例:
#include <iostream>
#include <Eigen/Eigenvalues>
int main()
{
Eigen::Matrix4f A;
A << -0.75, 0, -1.5, -1,
-1.25, 0, -1.5, -1,
-0.75, 0, -1, -1,
-0.25, 0, -1.5, -1;
Eigen::Matrix4f G;
G << 1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 0;
std::cout << "A = " << A << std::endl;
std::cout << "G = " << G << std::endl;
Eigen::GeneralizedEigenSolver<Eigen::Matrix4f> sol;
sol.compute(A.transpose()*A, G); // compute generalized eigenvalues
std::cout << "alphas = " << sol.alphas().transpose() << std::endl;
std::cout << "betas = " << sol.betas().transpose() << std::endl;
std::cout << "eigenvalues = " << sol.eigenvalues().transpose() << std::endl;
std::cout << "eigenvectors = " << sol.eigenvectors() << std::endl;
}
编译这个小例子需要53秒,但它在Ubuntu(gcc版本5.4.0,Ubuntu 16.04)上没有抱怨使用g ++而构建。
如果我尝试在Windows上使用mingw-w64(gcc版本6.2.0(x86_64-win32-seh-rev1,由MinGW-W64项目构建))编译它,编译器会说
as.exe: main.o: too many sections (48774)
Assembler messages:
Fatal error: can't write main.o: File too big
所以我尝试添加编译器标志-Wa,-mbig-obj
,如this stackoverflow问题中建议的那样。
启用标志mingw-w64编译示例,但我在1小时后链接期间取消了构建。我也尝试从Eigen's documentation编译示例。它需要大约3分钟,但完全使用mingw-w64构建。
由于构建时间较长,如果我想在实际应用中使用通用特征值求解器,则此解决方案不适用。
它认为这个问题与Eigen的模板结构有关,这导致单个源文件中的许多符号。看起来mingw对此不太满意。
有没有办法用mingw优化这种情况?