【问题标题】:.lib linking other .libs.lib 链接其他 .libs
【发布时间】:2010-12-28 13:45:57
【问题描述】:

目前我的visual studio基本上是在生成Engine.dll和Game.exe

Engine.dll 链接到其他一些基本库,例如: d3dx9d.lib ComCtl32.lib WinMM.lib WSock32.lib 等等

我也想尝试创建一个 Engine.lib,但现在我收到了一些非常好的警告:符号 x 已经定义。这些库定义了相同的符号。

所以我在某处读到我必须强制我的用户 (Game.exe) 链接到这些库。但我认为这真的很不方便,特别是如果我有很多游戏并且我决定在我的引擎中添加另一个库。只是为了这么简单的东西进行维护。

我应该坚持使用 .dll,还是有什么办法可以解决这个问题?

非常感谢,

安东

【问题讨论】:

    标签: c++ visual-studio symbols static-linking


    【解决方案1】:

    您需要决定是否需要 DLL 或静态链接库。 DLL 的优点是,如果您进行本地更改,构建时间会更快。 .lib 的优点是您最终只会得到一个可部署的文件。

    将其链接(静态 .lib 或 dll 的导入 .lib)是自动的。您要确保首先构建库,没有它就无法链接 .exe。右键单击解决方案资源管理器窗口中的 exe 项目,项目依赖项,勾选库项目。这会自动将 .lib 添加到 exe 项目的附加依赖项中。

    在引擎的头文件中使用#pragma comment(lib, "engine.lib") 是另一种方式。对 OS 导入库等其他依赖项重复此操作。获取正确的库路径是 // 待办事项。

    【讨论】:

      【解决方案2】:

      您是否创建了不同的命名空间以避免命名冲突?

      编辑——你问的问题似乎有些混乱,因为你问了几个问题。

      对我来说,听起来您想尝试实现自己的 Engine 类。但是,您遇到了命名问题。我现在更多地将其视为一个架构问题。如果您将游戏写入接口,那么问题就会消失。例如,如果您的 Engine 使用不同的算法,那么如果您编写了当前 Engine 和 YourEngine 实现的 EngineInterface,那么您可以轻松地使用 Strategy 在不同的实现之间快速切换。这很好,因为如果您将偏好设置到应用程序中,您将能够看到游戏中的差异。

      【讨论】:

      • 你的意思是我应该完全包装这些库并让用户不需要它们?
      • 我只是说如果你的应用程序调用一个接口而不是具体的东西,那么底层的实现是无关紧要的。您可以在当前的引擎 DLL 中包装 d3dx9d、winmm 等,但您可以在 MyEngine DLL 中使用 opengl。应用程序(本质上是“用户”)不应该关心。
      【解决方案3】:

      如果符号不应该相同,请使用不同的名称或控制它们的显示方式。另一种选择是使用命名空间来避免命名冲突。

      如果符号应该是相同的东西,您只需要在其中一个库中定义一次。

      【讨论】:

      • 可以在包含周围使用命名空间吗?
      • 只有在包含和函数定义上使用命名空间时,链接器才能以这种方式找到函数。
      猜你喜欢
      • 1970-01-01
      • 2019-05-08
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 2012-04-25
      • 2012-04-07
      • 1970-01-01
      相关资源
      最近更新 更多