2009-02-21 64 views
1

我剛剛構建了SDL.dll的更新版本,這是我的Delphi項目使用的開源C DLL,以及Express版本的Visual C++ 2005。我將它放在EXE文件夾中,並嘗試運行它,但它不會加載:現在C從來不是我的強項,但是我記得大學時有足夠的嘗試和追蹤這一點。我就在源代碼中閒逛,看看發生了什麼事這個功能,我發現它變灰,一個預處理指令之下:如何在VC++ 2005中定義HAVE_STDIO_H?

#ifdef HAVE_STDIO_H 

IIRC,STDIO是標準的C I/O庫。我認爲這意味着它不可用。任何人都知道爲什麼會這樣以及如何解決它?這是一個Visual C++問題還是一個SDL問題?

+0

請確認您已解壓縮並使用VisualC.html中的VisualC.zip,均可在SDL源歸檔中找到。 – vladr 2009-02-22 06:11:16

回答

2

大多數在Unix/Linux世界中,像HAVE_STDIO_H這樣的名稱表示代碼已被'autoconfiscated'(這是官方術語,用於描述與'autotools'一起工作的狀態,例如' autoconf的')。在這樣的設置中,配置過程將確定<stdio.h>是否可用並且將在其生成的config.h文件中設置#define HAVE_STDIO_H 1。然後編譯器會發現該平臺有<stdio.h>,並且會編譯匹配的代碼(當前灰顯的東西)。

由於Windows上的HAVE_STDIO_H可能有其他一些重要的意義,因此可以自信地適應您的Windows環境,因此您可能會決定在運行編譯器時將-DHAVE_STDIO_H包含在命令行選項中。或者你可以手動創建配置文件,並定義-DHAVE_CONFIG_H(這是表明配置設置在文件'config.h'中的正常方式)。在'config.h'文件中,如上所述,您將擁有#define HAVE_STDIO_H 1


注:在Unix上,你通常會發現所謂的「配置」指運行創建的config.h文件中的shell腳本。如果你有Cygwin,那麼你可以在Windows上使用該腳本 - 我剛剛檢查過,我在Solaris上創建的自動查找軟件包可以在Windows下的Cygwin中配置,它大部分都可以工作 - 除了某些網絡處理外。我不能保證它總是會失敗(但它是軟件 - 保證任何事情都非常危險)。我應該補充說,問題出在我的自動配置代碼中(網絡功能的測試顯然不是很正確),而不是Cygwin本身。如果我正確地完成了這項工作,它將會奏效。 (有人說「沒有便攜代碼,只有代碼已經移植了」,這適用於這裏)

你確實需要一個很好的Unix環境模擬。 MingW也可能工作。

1

它上面的預處理指令是做什麼的?

很可能,這僅僅是爲了確定編譯器的某些屬性,因爲無論宏是什麼意思,它都是灰色的,並不適用於您的編譯器。

您的問題很可能在其他地方。

因爲它找不到函數SDL_RWFromFP,所以您應該可能會看到該函數是否由於某種原因而被預處理器指令禁用。

然而,我的猜測是,該功能存在,但沒有得到標記爲__declspec(dllexport)的

不這樣做,它不會暴露,以便加載DLL的程序可以調用它。很可能你必須#定義一些東西來指定你想創建一個DLL,這將啓用必要的預處理器魔術來將dllexport部件插入到函數前面。

0

通常情況下,您不應該添加任何HAVE_STDIO_H:無論如何,這些並不是公開的(儘管很多項目會污染公共名稱空間)。

我想你沒有正確地構建SDL - 或者SDL沒有得到很好的支持(我對SDL知之甚少,所以這些都是沒有太多信息的瘋狂猜測)。有沒有SDL的測試套件,比如你可以測試內置的dll?