2009-02-21 68 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?