gpt4 book ai didi

c++ - 不能使用我自己的使用 SFML 的 DLL

转载 作者:行者123 更新时间:2023-11-30 01:55:44 29 4
gpt4 key购买 nike

我正在制作自己的游戏库,它使用 SFML 和 VS2013。我想通过将库设置为 DLL 来重用代码。但是,我在使用自己的 DLL 时遇到了问题。

下面详细描述一下我的情况:

  1. 这是游戏循环中的部分代码,其中 window 是一个 sf::RenderWindowrect 是一个对象在我的 DLL 中定义,它只是一个具有定义属性的 sf::RectangleShape(在 (0,0) 处的一个蓝色小矩形)。

    window.clear(sf::Color::White);
    window.draw(rect);
    window.display();

    但是,在window.draw(rect)之后,整个屏幕会变成黑色,尽管上面的语句应该将它清除为白色,而rect只占用左上角的一个小地方。

  2. 我的类应该没有问题,因为如果我将类声明和定义直接粘贴到主源文件中(当然删除像 __declspec(dllexport) 这样的东西),一切都很好。

  3. 我的 DLL 中所有不使用 SFML 的函数在从 DLL 加载时都能正常工作。

  4. SFML 在 DLL 项目和使用它的项目中都是静态链接的。

  5. 我查看并遵循 MSDN 来设置我的项目。

那么怎么解决呢?我想问题应该是我错过了一些使 DLL 能够使用另一个库的步骤,但我没有找到相关线程(可能我使用了错误的关键字......)

最佳答案

SFML is statically linked both in the DLL project and the project which uses it.

如果您确实将 SFML 静态链接到您的 DLL,那么您就会遇到问题,因为现在您的 finally 应用程序持有 SFML 的拷贝,而您的 DLL 持有 SFML 的拷贝。因此,在 DLL 中由 SFML 分配的内容不一定在应用程序中可用,反之亦然。

作为解决方案,您只能在最终应用程序中链接所有动态或静态的内容。这意味着您要么使用 SFML 的动态库,要么也链接您的静态库,并且只在您的应用程序中而不是在您的库中链接 SFML 静态。

由于您使用的是 VS 2013,因此您还必须重建 SFML 本身,如果您使用最新版本,则静态链接已更改 (full discussion)。所以这里有一些关于它如何与 SFML 2.0 或 2.1 一起工作的 ASCII 艺术。

             winmm   gdi32   opengl
/ \ | /
/ \ | /
v v v v
sfml-system-s sfml-window-s
| | | |
| +---------------+
| | | |
| +---------+ | |
| | | |
v v v v
example.exe <--- yourlib.dll

使用来自源(目标 2.3)的 SFML,它看起来像这样。

       sfml-system-s  sfml-window-s  winmm  gdi32  opengl
| | | | |
+------------+ +-------+ | | |
| | | +-----------------+ | |
| +-----------+ | +-----------------------+ |
| | | | | | +----------------------------+
| | | | | | |
v v v v v v v
yourlib.dll -> example.exe

然而,您本质上想要的是:

sfml-system-s  sfml-window-s  winmm  gdi32  opengl  yourlib-s
| | | | | |
| +-------+ | | | |
| | +-----------------+ | | |
| | | +-----------------------+ | |
| | | | +----------------------------+ |
| | | | | +----------------------------------+
| | | | | |
v v v v v v
example.exe

动态链接基本上已经像上一张图​​一样工作(只是不同),因此动态链接“开箱即用”。

网络上有很多关于链接如何工作等的信息。一个例子是 this forum post .

关于c++ - 不能使用我自己的使用 SFML 的 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20415314/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com