Я хочу скомпилировать следующий пример на основе общего решателя собственных значений 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 секунды, но он собирается без проблем с помощью g++ в Ubuntu (версия gcc 5.4.0, Ubuntu 16.04).
Если я попытаюсь скомпилировать его с помощью mingw-w64 (версия gcc 6.2.0 (x86_64-win32-seh-rev1, построен проект MinGW-W64)) в Windows, компилятор скажет
as.exe: main.o: too many sections (48774)
Assembler messages:
Fatal error: can't write main.o: File too big
поэтому я попытался добавить флаг компилятора -Wa,-mbig-obj
, как это было предложено в этом вопросе о стеке.
С включенным флагом mingw-w64 компилирует пример, но я отменил сборку во время линковки через 1 час. Я также попытался скомпилировать пример из документации Eigen. Это занимает около 3 минут, но полностью собирается с помощью mingw-w64.
Из-за длительного времени сборки это решение неприменимо, если я хочу использовать общий решатель собственных значений в реальном приложении.
Похоже, что эта проблема связана со структурой шаблона Eigen, которая приводит к множеству символов в одном исходном файле. Похоже, mingw это не очень устраивает.
Есть ли способ оптимизировать эту ситуацию с помощью mingw?