我正在使用 VS 2017专业版编译涉及 Eigen 3.3.4 的C ++命令行程序。
这是我的计划:
#include "stdafx.h"
#include <iostream>
#include "Eigen/Dense"
#include <Eigen/Sparse>
#include <Eigen/Eigenvalues>
#include <vector>
using namespace std;
using namespace Eigen;
using Eigen::Dynamic;
using Eigen::Matrix;
using Eigen::SparseMatrix;
typedef SparseMatrix<double, Eigen::RowMajor> SpMat;
int main()
{
try
{
MatrixXd mat(8, 8);
mat << 7, 0, 1, 0, 0, 2, 7, 0,
0, 4, 8, 0, 2, 0, 0, 0,
1, 8, 1, 0, 0, 0, 0, 5,
0, 0, 0, 7, 0, 0, 9, 0,
0, 2, 0, 0, 5, 1, 5, 0,
2, 0, 0, 0, 1, 1, 0, 5,
7, 0, 0, 9, 5, 0, 11, 0,
0, 0, 5, 0, 0, 5, 0, 5;
cout << mat << endl;
Eigen::LLT<Eigen::MatrixXd> lltOfA(mat);
cout << lltOfA.info() << endl;
SpMat sparseMat = mat.sparseView();
cout << "try SimplicialLLT solver" << endl;
SimplicialLLT<SpMat, Eigen::Upper> lltSolver;
lltSolver.compute(sparseMat);
cout << lltSolver.info() << endl;
}
catch (const exception& e)
{
cout << e.what() << endl;
}
return 0;
}
这是我的链接器选项:
/ OUT:“D:\ TestProjects \ LLTSolver \ x64 \ Release \ LLTSolver.exe”/ MANIFEST / LTCG / NXCOMPAT /PDB:"D:\TestProjects\LLTSolver\x64\Release\LLTSolver.pdb” / DYNAMICBASE“kernel32.lib”“user32.lib”“gdi32.lib”“winspool.lib” “comdlg32.lib”“advapi32.lib”“shell32.lib”“ole32.lib”“oleaut32.lib” “uuid.lib”“odbc32.lib”“odbccp32.lib”/ DEBUG / MACHINE:X64 / OPT:REF /增量:NO /PGD:"D:\TestProjects\LLTSolver\x64\Release\LLTSolver.pgd” / SUBSYSTEM:CONSOLE / MANIFESTUAC:“level ='asInvoker'uiAccess ='false'” /ManifestFile:"x64\Release\LLTSolver.exe.intermediate.manifest” / OPT:ICF / ERRORREPORT:PROMPT / NOLOGO / TLBID:1
这是我的编译选项:
/ Yu“stdafx.h”/ GS / GL / W3 / Gy / Zc:wchar_t / Zi / Gm- / O2 / sdl /Fd"x64\Release\vc110.pdb“/ D”WIN32“/ D”_CONSOLE“/ D”_UNICODE“/ D “UNICODE”/ errorReport:prompt / WX- / Zc:forScope / Gd / Oi / MD / Fa“x64 \ Release \”/ EHa / nologo / Fo“x64 \ Release \” /Fp"x64\Release\LLTSolver.pch“
以下是我的发现:
Release
标志编译它,并且没有优化(/Od
),那么程序可以正常工作。当我在命令行中运行程序时,可以生成输出Release
标志进行编译,并使用优化(/O1
或O/2
),则程序将崩溃,并且会以 甚至catch
语句都不能捕获异常 。 崩溃导致的唯一迹象是事件查看器:
Faulting module name: LLTSolver.exe, version: 0.0.0.0, time stamp: 0x5a6e9440
Exception code: 0xc0000005
Fault offset: 0x000000000000d4b4
Faulting process id: 0x5004
Faulting application start time: 0x01d398b0e99f62f4
当我在没有NDEBUG
宏(gcc等效于-DNDEBUG
)的情况下编译时,我会收到以下消息,有时;其他一些时候,根本没有错误信息。
Assertion failed: (m_outerIndex[outer+1]-m_outerIndex[outer]==0 || m_data.index(m_data.size()-1)<inner) && "Invalid ordered insertion (invalid inner index)",
在档案
.. \ eigen \ src / SparseCore / SparseMatrix.h,第393行
不太确定VS编译器优化是否应该受到指责,或者是否存在Eigen 3.3.4中的错误。我该如何进一步处理这个问题?