【问题标题】:Compiling Eigen to run on QNX 6编译 Eigen 以在 QNX 6 上运行
【发布时间】:2020-03-24 13:26:16
【问题描述】:

我很难让 Eigen 3.3.7 使用 QNX 6.5.0 或 6.6.0 进行编译。当我尝试编译简单的第一个程序示例时,来自Eigen getting started page

#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”来修复这些错误,但这表明我需要修复一个更大的问题。我感觉有一些冲突的命名空间或预处理器定义。任何帮助将不胜感激。

【问题讨论】:

    标签: eigen qnx


    【解决方案1】:

    与大多数其他平台不同,QNX 6.x 的 C++ stdlib 仅将许多 cmath 函数放在 std 命名空间中。 This is technically legal according to the C++11 standard,尽管它确实使可移植性具有挑战性。此外,如果您像 C 一样包含标头,QNX 仍会将它们放置在 std 命名空间中(即,#include &lt;cmath.h&gt; 仍然公开 std::expf,而不是 ::expf)。

    正如你所注意到的,Eigen 明确地期望它们在根命名空间中;据我了解,在过去的几年中,并非所有 C++ stdlib 实现都如此勤奋地将 C 库函数放在 std 命名空间中。

    作为一种解决方法,您可以使用 using 指令将它们添加到您自己的源文件中的根命名空间:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      相关资源
      最近更新 更多