2013-11-02 2 views
1

У меня есть проект C++ на Linux, где я включил путь к библиотеке:Intel <math.h> vs C <math.h>?

/opt/intel/include/ 

так, что я могу использовать некоторые библиотеки Intel. Тем не менее, я также хочу использовать стандартный 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(), а не Intel pow()?

+0

Возможный дубликат [Library include paths с тем же заголовком] (http: // stackoverflow.com/questions/5168242/library-include-paths-with-same-header-name) – Jon

ответ

2

Именно по этой причине C++ использует пространства имен для такого рода вещей, а также использует более конкретные имена заголовков, которые с меньшей вероятностью могут столкнуться с другими библиотеками.

Если вы #include <cmath> (который вы должны в программе C++, а не <math.h>), вы можете различать реализации STDLIB и Intel, с помощью std::pow (...). Это еще одна причина не применять using namespace std; волей-неволей, это может сделать код более чистым, но поскольку имена функций, используемые в stdlib, являются общими, они часто сталкиваются с другими библиотеками.

0

Кажется #error в компании Intel <math.h> довольно тупой и очевиден: заголовок охраняется от использования с другими компиляторами, вероятно, потому что это зависит от конкретных расширений (например, встроенные функции) не доступны в других компиляторов. Если это действительно <math.h>, он будет частью стандартной библиотеки C или C++ и, как таковой, связан с компилятором, если он явно не является частью платформы ABI, которая, похоже, не так.

Это не совсем так, как будто вы хотите использовать Intel <math.h>, но только другие заголовки из библиотеки Intel. В этом случае один из следующих методов могут работать:

  1. Укажите расположение системы/ССАГПЗ <math.h> с другим -I вариантом, предшествующего один для заголовков Intel: порядок, в котором ищутся заголовки, как правило, тот же порядок которые отображаются в параметрах -I.
  2. Не используйте директиву -I, чтобы найти заголовки Intel, но включать их с именем пути или с относительным именем пути (последнее в сочетании с опцией -I, например -I/opt/intel).
  3. Создайте пользовательский каталог с символьными ссылками на заголовки/каталоги в /opt/intel/include и удалите любой заголовок, который вы хотите получить из другого места. Альтернативно, работайте наоборот: создайте символическую ссылку на каждый заголовок, необходимый от /opt/intel/include.

Поскольку этот каталог, похоже, не предназначен для использования в качестве дополнения для других компиляторов, вполне возможно, что ничто из этого не будет работать: отправка заголовков с определенным компилятором имеет тенденцию чтобы быть конкретным для этого компилятора. Например, вам также потребуется связать с соответствующими библиотеками Intel, и я не уверен, что компилятор Intel и gcc используют один и тот же ABI (хотя в Linux они могут использовать общий ABI).

+0

Да Я знаю, что ошибка компиляции «довольно тупая и очевидная» - вот почему я спросил, как указать, хочу ли я использовать Intel или C/C++ Math.h .....?!?! – mezamorphic

+3

Вы читали за пределами первой строки, например, той части, где я описываю, что можно сделать? –

+0

@mezamorphic Если вы хотите использовать Intel math.h, вам нужно использовать компилятор Intel. Об этом сообщает сообщение об ошибке. Нет ничего, что можно «указать», чтобы изменить это. – sepp2k

Смежные вопросы