【问题标题】:Variable "undeclared" in "#pragma" command?“#pragma”命令中的变量“未声明”?
【发布时间】:2010-07-20 19:28:59
【问题描述】:

我正在 Fedora 8 机器上编译 Blender 3D 建模程序 from source(使用 SCONS)的一个分支,但遇到了一个我在编译相同源代码时没有遇到的错误一个 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 有点过时,它可能有一些旧版本的编译器把它弄乱了。任何人都知道如何绕过这个显示为“未声明”的变量?

【问题讨论】:

  • 使用 gcc 版本 4.1.2 20070925 (Red Hat 4.1.2-33);我要更新多少?
  • 编译器中的 OpenMP 实现很可能不理解是否有条件。尝试 g++ 4.4 或更高版本。或者,删除 if 条件

标签: c gcc openmp c-preprocessor


【解决方案1】:

那个编译器不支持 OpenMP。这是第一次提到 OpenMP 和 GCC

2006 年 3 月 9 日

...所以从 GCC 4.2 开始,编译器支持 OpenMP v2.5 规范。

这里的提示是很清楚地定义了值,但是根据预处理器错误,#pragma ... 行找不到定义。一旦您意识到代码使用了非标准的#pragma 编译器指令,编译器就会成为主要嫌疑人。

【讨论】:

  • 嗯,我会试试看,虽然我觉得奇怪的是具有相同 gcc 版本(4.1.2)的 CentOS 盒子没有这个问题,但 Fendora 盒子是(并且两者都是具有相同“硬件”的 VirtualBox 虚拟机)
  • 让我知道发生了什么。 OpenMP 声明您必须使用支持/受支持的编译器,因此需要先进行验证。我认为基本问题是#pragma(在这种情况下)依赖于编译器,所以如果不支持#pragma,你可能会看到预处理器/编译器的分歧。
  • 我在这个 Fedora 机器上从源代码编译了 gcc 4.2.4,并用它编译了 Blender,它用完整的 OpenMP 语句编译,但最终的二进制文件无法启动,抱怨 GLIBC '不够高的版本。所以,我要么在没有 OpenMP 支持的情况下进行编译(在 Blender 中编译时有一个标志),要么也升级 GLIBC...
【解决方案2】:

由于某种原因,CLOTH_OPENMP_LIMIT 实际上并未被定义。您可以在产生错误的行之前对其进行测试:

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

常见的原因是它依赖于定义的 OTHER 预处理器定义,或者未包含预期的标头。

【讨论】:

  • 我将这组三行添加到源文件中,发现错误输出没有任何变化(除了行号移动了 3 高)
【解决方案3】:

很难说,但要么:

  1. 将定义 CLOTH_OPENMP_LIMIT 更改为它的数值并重新编译
  2. 检查您的包含语句以确保 CLOTH_OPENMP_LIMIT 的实际定义正确。

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

【讨论】:

  • 我相信它已经设置为一个数值 (25),并且它是同一个文件的一部分,所以它不需要任何额外的包含语句,我认为...
【解决方案4】:

我猜 gcc 中的 OpenMP 在过去 4.1 出来的时候还是相当实验性的。如果将 OpenMP pragma 中的宏名称替换为数字常量,会发生什么情况?我不太确定标准对 pragma 中的宏替换有何规定,也许这个旧版本的 gcc 与新版本的策略不同。

【讨论】:

    猜你喜欢
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多