2012-07-07 54 views
2

请原谅我,如果这是一个愚蠢的问题,但我正在关注一本书,它不工作。 我有一个游戏引擎,它住在一个dll中。它在实际游戏应用程序中使用的几个外部函数:dll和应用程序之间的C++ extern用法

extern void game_preload(); 

这一切都是完美的,很正常,但是当我去打造我得到一个错误:

Undefined reference to `game_preload()' 

为什么这是?我怎么才能得到它建立的DLL,所以我可以在应用程序中实现这些功能?

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

编辑:我读了这本书错了,我应该做一个静态库,而不是一个动态的。但是我可以问,是否有类似于动态库的“extern”用法?

+0

在应用程序中使用'__declspec(dllexport)'和'__declspec(dllimport)'? ('__declspec(dllimport)void game_preload();')(它只适用于静态链接。) – Naszta 2012-07-07 16:33:36

+0

如果你按照本书的指示设置VC项目,那么你将创建一个EXE项目,而不是一个DLL项目。编写自己的game_preload函数是必需的,这就是您创建自定义游戏的方式。 – 2012-07-07 16:39:10

回答

0

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

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

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

+0

所以我删除“Extern”?他们在DLL中,所以我不能链接任何东西,因为我正在构建DLL – Constan7ine 2012-07-07 16:23:59

+0

认为它已经过时。你必须链接库,但是告诉你如何去做,知道你的编译器是很重要的。 – Mario 2012-07-07 16:28:43

+0

mingw,gcc是我的编译器。我要链接哪个库?我要链接的唯一东西是SDL和Opengl – Constan7ine 2012-07-07 16:29:59

相关问题