Компиляция Eigen для запуска на QNX 6 - PullRequest
0 голосов
/ 24 марта 2020

У меня проблемы с получением Eigen 3.3.7 для компиляции с использованием QNX 6.5.0 или 6.6.0. Когда я пытаюсь скомпилировать простой первый пример программы, со страницы начала работы Eigen .

#include <iostream>
#include <Eigen/Dense>
using Eigen::MatrixXd;
int main()
{
  MatrixXd m(2,2);
  m(0,0) = 3;
  m(1,0) = 2.5;
  m(0,1) = -1;
  m(1,1) = m(1,0) + m(0,1);
  std::cout << m << std::endl;
}

Компиляция с:

qcc -I. test_eigen.cpp

Я получаю все 18 ошибок тоже похоже:

In file included from ./Eigen/Core:411,
                 from ./Eigen/Dense:1,
                 from test_eigen.cpp:14:
./Eigen/src/Core/arch/CUDA/Half.h: In function 'Eigen::half Eigen::half_impl::exp(const Eigen::half&)':
./Eigen/src/Core/arch/CUDA/Half.h:454: error: '::expf' has not been declared

Хотя я могу исправить эти ошибки, добавив 'std' перед каждой отсутствующей функцией, это говорит о том, что есть еще большая проблема, которую мне нужно исправить. У меня есть ощущение, что есть некоторые конфликтующие пространства имен или определения препроцессора. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 25 марта 2020

В отличие от большинства других платформ, в C ++ stdlib QNX 6.x многие функции cmath размещаются ТОЛЬКО в пространстве имен std. Это технически законно в соответствии со стандартом C ++ 11 , хотя это затрудняет переносимость. Кроме того, QNX по-прежнему помещает их в пространство имен std, если вы включаете заголовок, как если бы он был C (ie. #include <cmath.h> по-прежнему предоставляет std :: expf, а не :: expf).

Eigen, как вы заметили, явно ожидает их в пространстве имен root; насколько я понимаю, в прошедшие годы не все реализации C ++ stdlib были настолько усердны в размещении C библиотечных функций в пространстве имен std.

В качестве обходного пути вы можете использовать директивы для добавления их в root Пространство имен в ваших собственных исходных файлах:

#include <cmath>
using std::expf;
#include <Eigen/Dense>
...