Saturday, May 01, 2010

可惡的GUID古董

我自己很喜歡用 C 寫程式,所以我是用一個叫 PellesC 的工具,來編寫遊戲程式。

早在一年多前,PellesC 更新了新版本 ( 是個 Major release 呢 ),我很興奮地下載來用,但是惡夢開始了,因為用這個新版本 Compile 的時候,出現了一大堆如下的 Error:
......
xxxXXX_GUID is multiply defined - in YYY.obj and ZZZ.obj
yyyXXX_GUID is multiply defined - in YYY.obj and ZZZ.obj
zzzXXX_GUID is multiply defined - in YYY.obj and ZZZ.obj
......

我不知道是甚麼問題,完全不明白新的 PellesC 為何會出現這些 Error ( 舊的版本卻完全沒有以上的問題... )。上網查查看,一大堆不明所以,又或者不相關的搜尋結果,看得我頭也大了。這一大堆古怪的 Error,令我只能回到舊版本的 PellesC 中,直到今天。

雖然近月的工作超級忙,但也抽了丁點的時間做些 Ogng'3D 的改善工作,決心再在那堆 GUID 問題裡鑽一鑽。上網再細心地看那些不明所以的搜尋結果,發現了 INITGUID 這個東西,原來這個東西可以說是個古董 ( 有點誇張 ... ),心裡忽然想到可能和這個有關係,再回看 Ogng'3D 中的 Source code,搜查一下,發現我確實用了這個 INITGUID,這時忽然覺得曙光漸露,即時裝上那個 PellesC 新版本 ( 但已是一年多前了... ),刪除了那句 INITGUID,然後 Compile,成功了!

原來是 INITGUID 這個老古董,害我不能用 PellesC 新版本達一年多,很令我討厭的說!( 同時也覺得自己很戇居,超級的那種... )

2 comments:

阿達瑪醫生 said...

看起來版大是用Pelles C隻高手,有個問題要請您幫忙:

最近在用Matlab上的一個軟體來分析影像,他需要呼叫一些.c files;小弟是用Windows XP (SP3),Matlab 7.8.0 R2009a

要呼叫的程式是來自http://bishopw.loni.ucla.edu/air5/index.html
根據其安裝說明http://bishopw.loni.ucla.edu/air5/config.html

Using your PC C compiler, compile all of the files in the src subdirctory
into a library

下面還有
Using your PC C compiler, compile each of the programs in the main AIR
directory. For example, compile the file 'alignlinear.c' to generate the
executable file 'alignlinear.exe'. You will need to link in the library
compiled in the previous step.

目前是用Pelles C來轉http://www.christian-heffner.de/
把src下的檔案全部轉成test.lib檔後
再去執行轉檔(已經在project option中之linker,加入test.lib;而且將test.lib加到folder所有之檔案夾中 ),以alignlinear.c為例:

若選擇Win32 Console program type,出現如下訊息:

Building alignlinear.obj.
Building alignlinear.exe.
POLINK: error: Unresolved external symbol '_AIR_parse_long'.
POLINK: error: Unresolved external symbol '_AIR_parse_float'.
POLINK: error: Unresolved external symbol '_AIR_parse_uint'.
POLINK: error: Unresolved external symbol '_AIR_do_alignlinear'.
POLINK: error: Unresolved external symbol '_AIR_report_error'.
POLINK: fatal error: 5 unresolved external(s).
*** Error code: 1 ***
Done.

若選擇Win32 program type,出現如下訊息:

Building alignlinear.obj.
E:\005 Academic\AIR5.2.6\AIR5.2.6\alignlinear.c(34): warning #2203: Function 'main' can't be __stdcall, changed to __cdecl.
Building alignlinear.exe.
POLINK: error: Unresolved external symbol '_WinMain@16'.
POLINK: fatal error: 1 unresolved external(s).
*** Error code: 1 ***
Done.

查了一下是要設定entry為WinMain,請問這該如何設定呢?
是在轉成test.lib時就要設定?
或是Pelles C本身環境的設定?

這個問題已經試了很多天還是無解,感謝各位的幫忙!
如果有其他更適合的軟體來做這件事,也請推薦與指導!

Ngan Lo ( 顏佬 ) said...

先說說, 其實我不是甚麼 PellesC 的高手, 因為也要一年時間才處理那個 GUID 問題... :(

對於 Matlab 和 AIR 我都不認識, 但單看你的陳述, 應該不是用'Win32 program type', 應用回'Win32 Console program type', 而且相信是你在 compile alignlinear.c 是 link 不到你的 test.lib, 才出現類似 'Unresolved external symbol' 的問題, 多是找不到你所說的 'test.lib'.