我刚刚使用Visual C ++ 2005的Express版本构建了SDL.dll的更新版本,这是我的Delphi项目使用的开源C DLL。我将它放在带有我的EXE的文件夹中并尝试运行它,但它不会加载:
The procedure entry point SDL_RWFromFP could not be located in the dynamic
link library SDL.dll.
现在C从来都不是我的强项,但我记得大学里有足够的东西试着跟踪这个。我在源代码中四处寻找,看看这个函数发生了什么,我发现它在预处理程序指令下面变灰了:
#ifdef HAVE_STDIO_H
IIRC,STDIO是标准的C I / O库。我认为这意味着它不可用。任何人都知道为什么会这样,以及如何解决它?这是Visual C ++问题还是SDL问题?
答案 0 :(得分:2)
大多数情况下,在Unix / Linux世界中,像HAVE_STDIO_H
这样的名称表明代码已经“自动混合”(这是用于描述与'autotools'一起使用的状态的官方术语比如'autoconf')。在这样的设置中,配置过程将确定<stdio.h>
是否可用,并将在其生成的#define HAVE_STDIO_H 1
文件中设置config.h
。然后编译会发现平台有<stdio.h>
并且会编译匹配的代码(当前灰色的东西)。
适应您的Windows环境,不到100%自信,因为在Windows上对HAVE_STDIO_H
可能有一些其他重要性,您可能会认为在命令行中包含-DHAVE_STDIO_H
是可以的运行编译器时的选项。或者您可以手动创建配置文件,并定义-DHAVE_CONFIG_H
(这是指示配置设置位于文件'config.h'中的常规方式)。在'config.h'文件中,您已经如上所述#define HAVE_STDIO_H 1
。
注意:在Unix上,您通常会找到一个名为“configure”的shell脚本,您可以运行该脚本来创建config.h文件。如果您有Cygwin,那么您可以在Windows上使用该脚本 - 我刚刚检查过我在Solaris上创建的自动配置软件包是否可以在Windows下在Cygwin下进行配置,并且它主要用于 - 除了一些网络处理。我不保证它总会失败(但它是软件 - 保证任何东西都非常危险)。我应该补充一点,问题出在我的自动配置代码中(网络功能的测试显然不太正确),而不是Cygwin本身。如果我正确地完成了这项工作,它就会奏效。 (有人说“没有可移植的代码;只有代码已被移植”。这适用于此。)
您确实需要对Unix环境进行良好的模拟。 MingW也可以工作。
答案 1 :(得分:1)
上面的预处理程序指令有什么作用?
最有可能的是,这仅仅是为了确定编译器的某些属性,并且它是灰色的,因为无论宏表示什么,都不适用于您的编译器。
你的问题最有可能发生在其他地方。
由于它找不到函数SDL_RWFromFP
,你应该看看该函数是否由于某种原因被预处理器指令禁用。
但是,我的猜测是该函数存在,但未标记为__declspec(dllexport)
如果没有它,它将不会被暴露,因此加载DLL的程序可以调用它。很可能你必须#define指定你要创建一个DLL,这将启用必要的预处理器魔法,将dllexport部分插入函数前面。
答案 2 :(得分:0)
通常情况下,您不必添加任何HAVE_STDIO_H:无论如何这些都不是公开的(尽管很多项目都会污染公共命名空间)。
我猜你没有正确构建SDL - 或者SDL没有很好地支持Visual Studio 2005(我对SDL知之甚少,所以这些都是没有太多信息的疯狂猜测)。是否有适用于SDL的测试套件,例如您可以测试内置的dll吗?