2010-07-20 28 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有一個不同於新版本的策略。