【问题标题】:C++ extern usage between dll and applicationdll和应用程序之间的C++外部使用
【发布时间】:2012-07-07 18:20:36
【问题描述】:

如果这是一个愚蠢的问题,请原谅我,但我正在关注一本书,但它不起作用。 我有一个游戏引擎,它存在于一个 dll 中。它有几个外部函数可以在实际游戏应用程序中使用:

extern void game_preload();

这一切都很完美而且很花哨,但是当我去构建所有的东西时,我得到了一个错误:

Undefined reference to `game_preload()'

这是为什么?我怎样才能让它构建出 dll 以便我可以在应用程序中实现这些功能?

我正在关注的这本书叫做“高级 2D 游戏开发”,它没有提到有问题。

编辑:我读错了这本书,我应该制作一个静态库而不是动态库。但是请问有没有类似动态库的“extern”用法?

【问题讨论】:

  • 在 DLL 中使用__declspec(dllexport),在应用程序中使用__declspec(dllimport)? (__declspec(dllimport) void game_preload();)(它只适用于静态链接。)
  • 如果您按照书中关于设置 VC 项目的说明进行操作,那么您将创建一个 EXE 项目,而不是 DLL 项目。需要编写自己的 game_preload 函数,这就是您创建自定义游戏的方式。

标签: c++ dll extern


【解决方案1】:

您必须链接静态或动态库(对于 MSVC,这是一个带有“lib”扩展名的文件,对于 GCC,这是“a”、“o”或“dll”,具体取决于您的系统等.)。 extern 关键字旨在告诉编译器可以在另一个编译单元中找到某些变量(如前向声明,但用于变量)。函数原型总是externanyway,所以这里可以省略。

还有一种特殊情况,使用extern "C" 明确告诉编译器将某些代码作为 C 而不是 C++ 处理(例如,链接到 C++ 代码中的 C 风格函数)。

编辑:创建和使用静态库更加容易。 You can read up on this including some examples here. 但是我认为它应该在书中的某些部分进行解释,除非你到目前为止不应该使用任何图书馆(如其中一个 cmets 所述)。

【讨论】:

  • 我要删除“外部”吗?它们在 dll 中,所以我无法链接任何东西,因为我正在构建 dll
  • 认为它已经过时了。您必须链接库,但要告诉您如何操作,了解您的编译器很重要。
  • mingw, gcc 是我的编译器。我要链接什么库?我唯一链接的是 SDL 和 Opengl
  • 如果您创建了自己的静态库,则必须像链接 SDL 和 OpenGL 一样链接它(请参阅我添加到答案中的链接)。
猜你喜欢
  • 1970-01-01
  • 2020-12-25
  • 2015-03-19
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
相关资源
最近更新 更多