【问题标题】:Link c++ object during runtime?在运行时链接 c++ 对象?
【发布时间】:2014-04-11 03:22:52
【问题描述】:

我正在尝试用 C++ 编写我的第一个游戏,我希望它能够从文件中动态加载所有内容。这包括敌人,我想知道是否有一种方法可以在运行时动态包含他们的代码,而不是链接 on compile,以便级别可以轻松互换。 Lua 可能是一个选项,但我不知道从哪里开始,而且 dll 似乎仅限 Windows(而且我也不知道从哪里开始)。有人可以帮忙吗?

tl;dr 我想在运行时将代码链接到我的 c++ 游戏。

【问题讨论】:

  • 我回答了你的问题一半,打算推荐 Lua,然后我看到你知道这个选项。在经历了将 Lua 嵌入到您的应用程序并决定如何包装您的 c/c++ 接口(SWIG 很棒)的痛苦之后,您不会后悔这个选项。回报是值得的。
  • @Chris 你有我可以遵循的教程吗?
  • 一种方法是在 Windows 上使用 Cygwin 或 Mingw,尽管您可以在 Linux 上编程时使用共享对象(dll 等效项)。如果你对在 Windows 中编程没问题,那就是:msdn.microsoft.com/en-us/library/ms235636.aspx
  • @Nav 我在 Linux 中编程,因为这是我父亲使用的,他可以帮助我,而且我还希望它是跨平台的。
  • @Aidan 抱歉不得不跑。我没有教程,我只是自己包含了文件并让编译工作。网上都有这方面的教程。没有发布一个,因为我不会尝试它并且不想粘贴错误的信息......尽管我会根据我为我的项目选择的基本步骤发布一个答案。

标签: c++ object dynamic runtime


【解决方案1】:

对于 Lua 方法,您首先需要先选择版本。现在有主要版本 5.1 和 5.2。我之前的工作是使用 5.1,对于我的新项目,我决定更新到 5.2,但是我发现我最喜欢的脚本包装工具 (SWIG) 不适用于 5.2。只是一开始就决定的事情,因为你不想让一个版本工作,然后不得不改变它。

Lua 自带 makefile 构建环境。我尝试在 Windows 上构建的第一次体验有点像噩梦,似乎并没有开箱即用,所以当时我选择创建自己的 Visual Studio 项目,并且只包含所有 .项目中的 C 文件。根据您打算如何编译,有两个文件需要选择性地包含/排除:lua.c 和 luac.c。如果您打算在您的应用程序中嵌入 Lua,请排除这两个文件;它们都包含一个 main() 函数,旨在构建控制台应用程序。在您的项目中包含所有其余的 C 文件。

从这里开始你应该可以轻松编译了。

当您包含 Lua 的标头时,请记住函数是 C 函数,因此如果您从 C++ 中包含它们,您需要将文件包含包装在:extern "C" {} - 例如:C++ Lua 5.1 Issue

将您的界面包装在另一个主题中,并且有很多可用资源。我最喜欢的是 SWIG,但有很多选择,包括手动编码 C/C++ -> LUA -> C/C++ 代码的转换。建议只专注于让第一部分首先工作,嵌入解释器,这样你就可以运行“你好,世界!”应用程序中的 Lua 脚本。

【讨论】:

    【解决方案2】:

    因此,按照您对跨平台使用和动态链接的要求,您可能正在寻找像 QT 这样具有 QLibrary 的环境:https://stackoverflow.com/a/9675063/453673

    但是https://softwareengineering.stackexchange.com/questions/88685/why-arent-more-desktop-apps-written-with-qt

    MingW 是 Visual C++ 的开源等价物,因此它可以帮助您编写 Windows 代码(尽管如果我有选择,我会直接使用 Visual C++)。在 Windows 中加载 dll 的方式是 somewhat similar 在 Linux 中加载它们的方式,因此您将能够使用 #ifdef 编写代码来进行条件编译。几年前我写过一个这样的程序。

    【讨论】:

      【解决方案3】:

      要在 Linux 下加载共享库(总是以 .so 作为后缀),可以使用 dlopen()、dlsym() 和 dlclose()

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多