特征值/特征值:mingw-w64的部分过多

Man*_*nyC 5 eigenvalue eigenvector eigen mingw-w64 eigen3

我想基于本征的一般特征值求解器(本征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;
}
Run Code Online (Sandbox Code Playgroud)

编译这个小例子需要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
Run Code Online (Sandbox Code Playgroud)

因此,我尝试-Wa,-mbig-obj按照 stackoverflow问题中的建议添加编译器标志。

启用标记后,mingw-w64会编译示例,但是我在1小时后的链接期间取消了构建。我还尝试从Eigen的文档中编译示例。它大约需要3分钟,但是完全可以使用mingw-w64构建。

由于构建时间长,因此如果我想在实际应用程序中使用通用特征值求解器,则此解决方案不适用。

似乎该问题与Eigen的模板结构有关,该模板结构在单个源文件中导致许多符号。看来mingw对此不太满意。

有没有办法用mingw优化这种情况?