SDL_Texture - 不完整类型

9

一天前,我安装了一个SDL2库。但是在Debian Wheezy上还没有这个库,所以我使用了“configure,make,make install”命令。

最后,当我尝试使用SDL_Texture时,我遇到了下面的错误:

error: forward declaration of ‘SDL_Texture {aka struct SDL_Texture}’
invalid use of incomplete typeSDL_Texture {aka struct SDL_Texture}’

在查找声明后,我在SDL_render.h文件中找到了以下两行内容:

struct SDL_Texture;
typedef struct SDL_Texture SDL_Texture; 

没有任何定义。我认为我的安装缺少文件SDL_sysrender.h。它在我下载的源代码中,但不在SDL2包含路径中。

问题应该出在哪里?需要使用任何标志来配置文件吗? 感谢您的帮助。


你包含了哪些头文件?听起来其中一个SDL类的头文件有前向声明,但是该类的实际头文件没有被包含在某个地方,因此你只有一个不完整的类定义。我不知道如果调用未找到的头文件会发生什么情况,但是我猜测你会得到链接器错误而不是这个错误。 - Chemistpp
我目前只包含了SDL_render.h。我将尝试使用SDL.h并查看会发生什么。 - Lorin
即使有SDL.h,问题仍然存在。 - Lorin
1个回答

15

您的安装没有任何问题。SDL_Texture是一种不透明类型,这是设计意图(即仅由SDL2内部操作),您可以将其“传递”为指针,但您无法访问其内部(例如通过malloc创建SDL_Texture,因为您不知道结构的大小)。如果您坚持使用

SDL_Texture *blah;

如果你能理解指针并将它们传递给SDL2函数,那么你就可以了解这个。

SDL_sysrender.h是一个内部头文件,正如你所提到的,它实际上为库的内部消费定义了SDL_Texture。


1
啊,我的错。 我该如何编辑纹理或访问其属性?例如,在创建已存在的纹理的副本时? - Lorin
我知道这个,但它没有提供“渲染器”信息。我无法使用相同的渲染器创建给定纹理的副本... - Lorin
1
我指的是深拷贝(不仅仅是复制指针,而是使用相同的参数创建另一个纹理)。 - Lorin
1
是的,这是SDL2 API中的一个漏洞。实际上,在操作SDL_Texture时请求渲染器是多余的,因为纹理内部知道它属于哪个渲染器(实际上有内部检查来验证您不会混淆它们)。您可以在外部跟踪渲染器(大多数应用程序仅使用一个渲染器),或者向SDL填写错误报告,要求进行修改并说明您面临的问题。 - gabomdq
这对我来说一直是一个奇怪的设计选择,至少与 SDL_GLContext(又名 void*)等东西相比如此。毕竟,您无法取消引用 SDL_Window*SDL_Texture* 等 - 可见指针导致我尝试使用 shared_ptr/unique_ptr/等来删除原始指针并强制执行正确的内存管理(并导致了一些非常令人困惑的错误)。如果不了解实现隐藏或 SDL 本身,这对我来说似乎是误导性的。是否有其他选项?为什么不能/不会公开定义结构以包含/隐藏这些仅声明的结构? - John P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接