1

我在 Linux 上有一个 C++ 项目,其中包含了库路径:

/opt/intel/include/

这样我就可以使用某些英特尔库。但是,我也希望使用标准 C/C++ math.h 以便我可以调用pow(x,y);

我包括<math.h>并使用using namespace::std,然后使用pow(x,y). 编译器(gcc4.7)抱怨:

/opt/intel/include/math.h:27:3: error: #error "此 Intel 仅用于 Intel 编译器!"

如何指定我指的是 C/C++ math.hpow()而不是 Intel pow()

4

2 回答 2

2

这就是 C++ 使用命名空间来处理这类事情的原因,并且还使用了更具体的标头名称,这些名称不太可能与其他库发生冲突。

如果您#include <cmath>(您应该在 C++ 软件中使用,而不是<math.h>),您可以使用std::pow (...). 这也是不随意应用的另一个原因using namespace std;,它可能会使代码看起来更干净,但由于 stdlib 中使用的函数名称非常通用,它们经常与其他库发生冲突。

于 2013-11-02T23:34:38.093 回答
0

#error英特尔的似乎<math.h>相当直率和明显:头文件被防止与其他编译器一起使用,可能是因为它依赖于其他编译器中不可用的特定扩展(例如,内置函数)。如果确实<math.h>如此,它将是标准 C 或 C++ 库的一部分,因此与编译器相关联,除非它明确是平台 ABI 的一部分,但似乎并非如此。

看起来好像您不想使用 Intel 的<math.h>,而只想使用 Intel 库中的其他标头。在这种情况下,以下技术之一可能会起作用:

  1. <math.h>使用 Intel 标头之前的另一个选项指定 system/gcc 的位置-I:搜索标头的顺序通常与-I选项出现的顺序相同。
  2. 不要使用-I指令来查找 Intel 的标头,而是将它们包含在路径名或相对路径名中(后者与-I选项组合,例如-I/opt/intel)。
  3. 创建一个自定义目录,其中包含指向标头/目录的符号链接,/opt/intel/include并删除您想从其他地方获取的任何标头。或者,换一种方式工作:创建一个符号链接到/opt/intel/include.

由于该目录似乎没有被构造为可用作其他编译器的插件,因此很可能所有这些都不起作用:带有特定编译器的头文件倾向于特定于该编译器. 例如,您还需要链接到相应的英特尔库,我不确定英特尔编译器和 gcc 是否使用相同的 ABI(但在 Linux 上它们可能使用通用 ABI)。

于 2013-11-02T23:38:02.670 回答