2013-11-02 42 views
1

我有,我已经包括在库路径Linux上的C++项目:Intel <math.h> vs C <math.h>?

/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 "This Intel is for use with only the Intel compilers!"

如何指定,我指的是C/C++文件math.h pow(),而不是英特尔pow()

+0

[Library include include path has same header name](http:// stackoverflow。com/questions/5168242/library-include-paths-with-same-header-name) – Jon

回答

2

这就是C++为这类事物使用命名空间的原因,也使用了更不可能与其他库相冲突的更具体的标题名称。

如果#include <cmath>(这你应该在C++软件,而不是<math.h>),你可以在STDLIB的实现和英特尔的使用std::pow (...)区分。这也是另一个不适用using namespace std;的原因,它可能会使代码看起来更清晰,但由于stdlib中使用的函数名称非常通用,所以它们经常会与其他库相冲突。

0

看来英特尔<math.h>#error是相当生硬,明显的:头防护,以防与其他编译器的使用,可能是因为它依赖于特定的扩展(例如,内置函数)在其他编译器不可用。如果它真的是<math.h>它将成为标准C或C++库的一部分,因此与编译器绑定,除非它明确是平台ABI的一部分,但似乎并非如此。

它看起来并不像你想使用英特尔的<math.h>,而只是来自英特尔库的其他头文件。在这种情况下的以下技术之一可能工作:

  1. 与另一-I选项一个英特尔的标题前述指定系统/ GCC <math.h>的位置:其中标头的搜索顺序通常是相同的顺序在其中-I选项出现。
  2. 请勿使用-I指令查找英特尔的标题,但将其包含路径名或相对路径名(后者与-I选项(例如-I/opt/intel)结合使用)。
  3. /opt/intel/include中的标头/目录创建一个带有符号链接的自定义目录,并删除任何你想从别处获取的标题。或者,也可以采用其他方式:创建一个符号链接,指向/opt/intel/include所需的每个标题。

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

+0

是的,我知道编译错误是“非常直接和明显” - 这就是为什么我问如何指定我是想使用英特尔还是C/C++ Math.h .....?!?! – mezamorphic

+3

您是否读过第一行,例如,我描述了可以完成的部分? –

+0

@mezamorphic如果您想使用英特尔math.h,则需要使用英特尔编译器。这就是错误信息告诉你的。没有什么可以“指定”来改变这一点。 – sepp2k