【问题标题】:Can't use my own DLL which uses SFML不能使用我自己的使用 SFML 的 DLL
【发布时间】:2013-12-06 03:20:19
【问题描述】:

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

以下是我的情况的详细描述:

  1. 这是游戏循环中的部分代码,其中windowsf::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能够使用另一个库的步骤,但是我没有找到相关的线程(可能我使用了错误的关键字......)

【问题讨论】:

    标签: c++ dll visual-studio-2013 sfml


    【解决方案1】:

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

    如果您确实将 SFML 静态链接到您的 DLL,那么您将遇到问题,因为现在您的最终应用程序拥有 SFML 的副本,而您的 DLL 拥有 SFML 的副本。因此,SFML 在 DLL 中分配的内容不一定在应用程序中可用,反之亦然。

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

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

                 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

    【讨论】:

    • 谢谢。我尝试动态链接所有内容并且它有效。没想到是静态链接和动态链接的问题……应该对链接的工作原理有更深入的了解。
    • 我很高兴它现在可以工作了。我添加了一些图表,也许可以帮助您了解正在发生的事情。另外,如果您认为它是答案,请标记为这样。
    猜你喜欢
    • 2020-07-02
    • 2014-02-27
    • 2013-10-09
    • 2015-09-01
    • 2012-02-29
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    相关资源
    最近更新 更多