2013-11-02 41 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