Переменная "undeclared" в команде "#pragma"? - PullRequest
1 голос
/ 20 июля 2010

Я компилирую ветку Blender программы 3D-моделирования из источника (используя SCONS ) на компьютере с Fedora 8 и работаю вошибка, с которой я не столкнулся при компиляции одного и того же источника в CentOS 5, и я думаю, что это связано с определением переменной.Ошибка:

source/blender/blenkernel/intern/implicit.c: In function ‘mul_bfmatrix_lfvector’:
source/blender/blenkernel/intern/implicit.c:592: error: ‘CLOTH_OPENMP_LIMIT’ undeclared (first use in this function)
source/blender/blenkernel/intern/implicit.c:592: error: (Each undeclared identifier is reported only once
source/blender/blenkernel/intern/implicit.c:592: error: for each function it appears in.)
source/blender/blenkernel/intern/implicit.c: In function ‘cloth_calc_force’:
source/blender/blenkernel/intern/implicit.c:1700: error: ‘CLOTH_OPENMP_LIMIT’ undeclared (first use in this function)

Файл implicit.c определяет эту переменную;Вот первые несколько строк файла:

#include "MEM_guardedalloc.h"

#include "BKE_cloth.h"

#include "DNA_object_force.h"

#include "BKE_effect.h"
#include "BKE_global.h"
#include "BKE_utildefines.h"

#include "BLI_threads.h"

#define CLOTH_OPENMP_LIMIT 25

#ifdef _WIN32
#include <windows.h>
static LARGE_INTEGER _itstart, _itend;
static LARGE_INTEGER ifreq;

две строки, которые выдают ошибку:

#pragma omp parallel sections private(i) if(vcount > CLOTH_OPENMP_LIMIT)

и

#pragma omp parallel for private(i) if(numverts > CLOTH_OPENMP_LIMIT)

Яугадывание ошибки происходит из-за компилятора и того, как он обрабатывает, когда в процессе компиляции эта переменная определена, и, поскольку Fedora 8 немного устарела, у него может быть более старая версия некоего компилятора, который ее испортил.У кого-нибудь есть идея, как мне обойти эту переменную, отображаемую как "undeclared"?

Ответы [ 4 ]

1 голос
/ 21 июля 2010

Этот компилятор не поддерживает OpenMP.Это первое упоминание об OpenMP и GCC

9 марта 2006 г.

... поэтому, начиная с GCC 4.2, компилятор поддерживает спецификацию OpenMP v2.5.

напоследок достаточно ясно, что значение определено, но строка #pragma ... не может найти определение, согласно ошибке препроцессора.Как только вы поймете, что в коде используется нестандартная директива компилятора #pragma, компилятор становится главным подозреваемым.

0 голосов
/ 20 июля 2010

Похоже, по какой-то причине CLOTH_OPENMP_LIMIT на самом деле не определяется.Вы можете проверить это прямо перед строками, которые генерируют ошибку:

#ifndef CLOTH_OPENMP_LIMIT
#error "Ooops, CLOTH_OPENMP_LIMIT not defined!"
#endif

Распространенными причинами может быть то, что это зависит от определения определяемого препроцессора OTHER, или заголовок не включается, когда ожидается.

0 голосов
/ 21 июля 2010

Полагаю, что OpenMP в gcc был довольно экспериментальным в старые времена, когда вышла 4.1.Что произойдет, если вы замените имя макроса в прагме OpenMP на числовую константу?Я не совсем уверен, что стандарты говорят о замене макросов внутри прагм, возможно, у этой старой версии gcc другая стратегия, чем у более новых.

0 голосов
/ 20 июля 2010

Трудно сказать, но либо:

  1. Измените определение CLOTH_OPENMP_LIMIT на его числовое значение и перекомпилируйте
  2. Проверьте операторы включения, чтобы убедиться, что CLOTH_OPENMP_LIMIT действительно определен правильно.

Если это все еще не работает, то OpenMP API в вашем компиляторе устарел, не установлен или не работает.

...