我在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.h pow()而不是Intel pow()
发布于 2013-11-02 23:34:38
这就是为什么C++在这类事情中使用名称空间,并且使用更具体的标题名称,这些名称不太可能与其他库发生冲突。
如果您使用#include <cmath> (您应该使用C++软件,而不是<math.h>),则可以通过使用std::pow (...)区分stdlib的实现和Intel的实现。这也是不应用using namespace std;的另一个原因,它可能会使代码看起来更简洁,但是由于stdlib中使用的函数名非常通用,所以经常与其他库发生冲突。
发布于 2013-11-02 23:38:02
在英特尔的#error中,<math.h>似乎相当直白和明显:头部被其他编译器禁止使用,这可能是因为它依赖于其他编译器无法使用的特定扩展(例如内置函数)。如果它确实是<math.h>,那么它将是标准C或C++库的一部分,因此它与编译器绑定在一起,除非它明确地是平台ABI的一部分,但情况似乎并非如此。
看起来你不太想使用英特尔的<math.h>,而只是使用英特尔库中的其他头文件。在这种情况下,下列技术之一可能有效:
-I选项指定系统/gcc-I的位置:搜索标头的顺序通常与-I选项出现的顺序相同。-I指令来查找英特尔的头部,而是使用路径名称或相对路径名称(后者与-I选项(例如-I/opt/intel)结合使用)。/opt/intel/include中的标题/目录的符号链接的自定义目录,并删除您希望从其他地方获取的任何标头。或者,另一种方法是:创建一个指向/opt/intel/include所需的每个标头的符号链接。由于这个目录似乎不能作为其他编译器的附带目录使用,所以很有可能所有这些都不起作用:与特定编译器一起传送的头文件倾向于特定于该编译器。例如,您还需要链接到相应的Intel库,我不确定Intel编译器和gcc是否使用相同的ABI (不过,在Linux上他们可能使用普通的ABI )。
https://stackoverflow.com/questions/19747942
复制相似问题