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

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

我正在制作自己的游戏库,它使用 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/

相关文章:

c++ - 在这种情况下,我应该为每个 WSASend 调用传递唯一的 OVERLAPPED 结构吗?

c++ - 迪尔德 : lazy symbol binding failed: Symbol not found: _yylex

python - 找到 dll,但无法从当前工作目录加载

c# - asp.net core 2.0 发布生成大量 DLL

c# - 无法在 Visual Studio 2013 中找到 "bring to front"和 "send to back"选项

c# - 键入时缺少 Visual Studio 2013 智能感知快速信息

c++ - 错误 : declaration of '<...>' . 奇怪的编译器错误

c++ - 什么是 Linux 上易于使用的 C++ 分析器?

windows - Windows 中供应商的 OpenGL 驱动程序在哪里?

svn - AnkhSvn 已安装但无法在 Visual Studio 2013 中运行