Ошибка компиляции собственной библиотеки с компилятором intel в Linux

#c #templates #eigen #eigen3

#c #шаблоны #eigen #eigen3

Вопрос:

Я успешно могу скомпилировать собственный файл на cygwin с помощью компиляторов mingw.

При компиляции в Linux с помощью компилятора Intel C я получаю следующую ошибку.

Я использую собственную библиотеку для решения AX = B.

Я использую Eigen3.3-rc1.

есть идеи, как это исправить?

Спасибо.

./Eigen/src/Core/CoreEvaluators.h(491): ошибка: вызов объекта типа класса без соответствующего оператора () или функции преобразования в тип указателя на функцию возвращает m_wrapper(m_functor,index); обнаружен во время: создания экземпляра «Eigen::CwiseNullaryOp::Собственный коэффициент возврата:: внутренний:: оценщик>:: коэффициент (indexType) const [с NullaryOp= Собственный:: внутренний:: scalar_constant_op, PlainObjectType= Собственный:: Matrix, indexType=long]» в строке 637 из «./Собственный/src/Core/AssignEvaluator.h» . . .ошибка продолжается

Редактировать: более крупное сообщение об ошибке выглядит следующим образом.

 ./Eigen/src/Core/CoreEvaluators.h(491): error: call of an object of a class type without appropriate operator() or conversion functions to pointer-to-function type
  return m_wrapper(m_functor,index);
         ^
      detected during:
        instantiation of "Eigen::CwiseNullaryOp<NullaryOp, PlainObjectType>::CoeffReturnType Eigen::internal::evaluator<Eigen::CwiseNullaryOp<NullaryOp, PlainObjectType>>::coeff(IndexType) const [with NullaryOp=Eigen::internal::scalar_constant_op<double>, PlainObjectType=Eigen::Matrix<double, -1, 1, 0, -1, 1>, IndexType=long]" at line 637 of "./Eigen/src/Core/AssignEvaluator.h"
        instantiation of "void Eigen::internal::generic_dense_assignment_kernel<DstEvaluatorTypeT, SrcEvaluatorTypeT, Functor, Version>::assignCoeff(Eigen::Index={ptrdiff_t={long}}) [with DstEvaluatorTypeT=Eigen::internal::evaluator<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 0, Eigen::Stride<0, 0>>, -1, -1, false>, -1, 1, true>, -1, 1, false>>,
                  SrcEvaluatorTypeT=Eigen::internal::evaluator<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1>>>, Functor=Eigen::internal::div_assign_op<double, double>, Version=0]" at line 390 of "./Eigen/src/Core/AssignEvaluator.h"
        instantiation of "void Eigen::internal::unaligned_dense_assignment_loop<false>::run(Kernel amp;, Eigen::Index={ptrdiff_t={long}}, Eigen::Index={ptrdiff_t={long}}) [with Kernel=Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 0, Eigen::Stride<0, 0>>, -1, -1, false>, -1, 1, true>, -1, 1, false>>,
                  Eigen::internal::evaluator<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1>>>, Eigen::internal::div_assign_op<double, double>, 0>]" at line 413 of "./Eigen/src/Core/AssignEvaluator.h"
        instantiation of "void Eigen::internal::dense_assignment_loop<Kernel, 3, 0>::run(Kernel amp;) [with Kernel=Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 0, Eigen::Stride<0, 0>>, -1, -1, false>, -1, 1, true>, -1, 1, false>>, Eigen::internal::evaluator<Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1>>>,
                  Eigen::internal::div_assign_op<double, double>, 0>]" at line 713 of "./Eigen/src/Core/AssignEvaluator.h"
        instantiation of "void Eigen::internal::call_dense_assignment_loop(const DstXprType amp;, const SrcXprType amp;, const Functor amp;) [with DstXprType=Eigen::Block<Eigen::Block<Eigen::Block<Eigen::Map<Eigen::Matrix<double, -1, -1, 0, -1, -1>, 0, Eigen::Stride<0, 0>>, -1, -1, false>, -1, 1, true>, -1, 1, false>, SrcXprType=Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>, Eigen::Matrix<double, -1, 1, 0, -1, 1>>, Functor=Eigen::internal::div_assign_op<double, double>]" at line
                  862 of "./Eigen/src/Core/AssignEvaluator.h"
        [ 6 instantiation contexts not shown ]
        instantiation of "void Eigen::internal::partial_lu_inplace(MatrixType amp;, TranspositionType amp;, TranspositionType::StorageIndex amp;) [with MatrixType=Eigen::Matrix<double, -1, -1, 0, -1, -1>, TranspositionType=Eigen::Transpositions<-1, -1, int>]" at line 530 of "./Eigen/src/LU/PartialPivLU.h"
        instantiation of "void Eigen::PartialPivLU<_MatrixType>::compute() [with _MatrixType=Eigen::Matrix<double, -1, -1, 0, -1, -1>]" at line 131 of "./Eigen/src/LU/PartialPivLU.h"
        instantiation of "Eigen::PartialPivLU<_MatrixType> amp;Eigen::PartialPivLU<_MatrixType>::compute(const Eigen::EigenBase<OtherDerived> amp;) [with _MatrixType=Eigen::Matrix<double, -1, -1, 0, -1, -1>, InputType=Eigen::Matrix<double, -1, -1, 0, -1, -1>]" at line 323 of "./Eigen/src/LU/PartialPivLU.h"
        instantiation of "Eigen::PartialPivLU<_MatrixType>::PartialPivLU(const Eigen::EigenBase<OtherDerived> amp;) [with _MatrixType=Eigen::Matrix<double, -1, -1, 0, -1, -1>, InputType=Eigen::Matrix<double, -1, -1, 0, -1, -1>]" at line 606 of "./Eigen/src/LU/PartialPivLU.h"
        instantiation of "const Eigen::PartialPivLU<Eigen::DenseBase<Derived>::PlainObject> Eigen::MatrixBase<Derived>::lu() const [with Derived=Eigen::Matrix<double, -1, -1, 0, -1, -1>]" at line 245 of "Matrix.cpp"
  

Вот соответствующий код, который использует Eigen

 #include <Eigen/Eigen>
using Eigen::MatrixXd;
using Eigen::VectorXd;

int solveAXBEigen(double *a, double *b, double *x, int n) {
    MatrixXd A(n, n);
    for (int i = 0; i < n; i  ) {
        for (int j = 0; j < n; j  ) {
            A(i, j) = a[n * i   j];
        }
    }
    VectorXd B(n);
    for (int i = 0; i < n; i  ) {
        B(i) = b[i];
    }
    VectorXd X = A.lu().solve(B);
    for (int i = 0; i < n; i  ) {
        x[i] = X(i);
    }
    return 0;
}
  

Комментарии:

1. Все модульные тесты нормально компилируются с помощью ICC, поэтому, пожалуйста, покажите строку кода, вызывающую эту проблему.

2. Вопрос отредактирован, чтобы включить соответствующий код, а также более крупный список сообщений об ошибках.

3. Здесь ваш пример отлично компилируется с ICC 16.0.2 и Eigen 3.3-rc1.

4. Я использую icc (ICC) 11.1 20090827 для компиляции. Не уверен, имеет ли это значение. Я изо всех сил пытаюсь найти способ успешной компиляции.

5. ICC 11 некоторое время не тестировался. Это может объяснить проблему. Либо обновите свой компилятор, используйте другой компилятор, либо найдите исправление. Я предполагаю, что проблема исходит от помощников has_nullary_operator , has_unary_operator , и has_binary_operator в Eigen/src/Core/util/Meta.h . Они пытаются определить, имеет ли класс нулевой, унарный или двоичный operator() , используя SFINAE.

Ответ №1:

Типичная проблема C . C позволяет определять «функциональные объекты» с помощью перегруженных операторов «()», которые позволяют их вызывать. он также допускает шаблоны. Где-то во взаимодействии разрешения оператора и шаблонов что-то пошло не так, либо в компиляторе, либо в коде. Теперь будет сложно разобраться. Все это будет настолько обернуто объектно-ориентированными и универсальными программными конструкциями, что будет трудно изолировать проблему. Однако начните со строки, в которой генерируется ошибка, и попытайтесь увидеть, где код пытается определить оператор () для этого объекта.

Комментарии:

1. Я использую внешнюю библиотеку и не знаком с кодом, поэтому мне было бы очень сложно определить источник проблемы. Все еще пытаюсь разобраться.. как решить проблему?