2010-07-20 49 views
1

我正在编译一个Fedora 8盒子上的Blender 3D建模程序from source(使用SCONS)的一个分支,并且遇到了一个错误,我没有遇到在CentOS 5盒子上编译同一个源文件,我我认为它与变量定义有关。错误是:“#pragma”命令中的变量“undeclared”?

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有点过时,它可能会有一些旧版本的编译器将其搞乱。任何人都有一个想法,我如何解决这个变量显示为“未声明”?

+2

使用新编译器 – Anycorn 2010-07-20 19:32:04

+0

使用gcc版本4.1.2 20070925(Red Hat 4.1.2-33);我需要走多少新的? – MidnightLightning 2010-07-20 19:43:27

+0

很可能在您的编译器中,OpenMP实现不了解是否有条件。 尝试g ++ 4.4或更高版本。或者,如果条件 – Anycorn 2010-07-20 20:16:30

回答

1

该编译器不支持OpenMP。这是OpenMP和GCC

3月9日的第一次提到,2006年

...所以用GCC 4.2编译器开始支持OpenMP的V2.5规范。

根据预处理器错误,此处的提示非常清楚,值已定义,但#pragma ...行无法找到定义。一旦你意识到代码正在使用非标准的#pragma编译器指令,编译器就会成为主要的嫌疑人。

+0

呵呵,我会试试看,尽管我觉得奇怪的是CentOS有一个相同的gcc版本(4.1。 2)没有这个问题,但是Fendora盒子(并且都是具有相同“硬件”的VirtualBox虚拟机) – MidnightLightning 2010-07-21 13:13:42

+0

让我知道会发生什么。 OpenMP声明您必须使用支持/支持的编译器,以便首先验证需求。 我认为基本问题是#pragma是(在这种情况下)是依赖于编译器的,所以如果#pragma不被支持,你可能正在见证预处理器/编译器的不一致。 – 2010-07-21 17:31:55

+0

我在这个Fedora盒子上从源代码编译了gcc 4.2.4,并且编译了Blender,并且它完整地编译了OpenMP语句,但是最终的二进制文件不会启动,抱怨GLIBC版本不够高。所以,我要么在没有OpenMP支持的情况下进行编译(在Blender的编译时有一个标志),或者升级GLIBC ... – MidnightLightning 2010-07-21 20:56:39

0

很难说,但可以:

  1. 更改定义CLOTH_OPENMP_LIMIT到它的数值,并重新编译
  2. 检查包括表,以确保CLOTH_OPENMP_LIMIT实际上是被正确定义。

如果仍然不起作用,那么编译器上的OpenMP API已过时,未安装或无法正常工作。

+0

,我相信它已经设置为一个数值(25),并且它是同一个文件的一部分,所以它不需要任何额外的包含语句,我认为... – MidnightLightning 2010-07-20 20:11:36

0

它看起来像某些原因CLOTH_OPENMP_LIMIT实际上并没有被定义。您可以在生成该错误的行之前测试这一权利:

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

的常见原因是,这取决于其他预处理定义被定义,或预期时,不包括报头。

+0

我添加了这三行的集合源文件,并且看到错误输出没有变化(除了行号移到3以上) – MidnightLightning 2010-07-20 20:07:27

0

我猜测在4.1版本发布时,gcc中的OpenMP仍然是相当实验性的。如果使用数字常量替换OpenMP编译指示中的宏名称,会发生什么情况?我不太清楚这些标准对杂记内部的宏替换有什么看法,也许这个旧版本的gcc有一个不同于新版本的策略。