【发布时间】:2012-03-10 00:20:30
【问题描述】:
上下文
我正在使用 SDL 和 OpenGL 制作游戏引擎。我正在尝试找到使用精美的真字体将文本输出到屏幕的最佳方式,但我遇到了 FTGL。 (如果您有更好/更简单的解决方案,请随时分享。)
编译 FTGL
它需要 FreeType2 才能工作,所以我得到了它,编译它(使用 Code::Block),然后我也使用 Code::Block 编译了 FTGL 库。
我正在使用带有 CDT 插件的 Eclipse Indigo。我不确定要采用哪个库,因为有一个 .lib 和一个 .dll 文件。我都试过了,但这似乎根本没有改变我的问题,目前就在这条线上:
FTfont* m_Font = new FTTextureFont(filename.c_str());
错误是:
The type 'FTTextureFont' must implement the inherited pure virtual method 'FTFont::MakeGlyph'
如果我使用另一个 FTfont 子类,它不会改变,例如FTPixmapFont 构造函数。
这是我尝试过的链接器标志:
-lmingw32 -lSDLmain -lSDL -lSDL_image -lSDL_net -lSDL_ttf -lftgl -lfreetype234_D -lopengl32 -lglu32
-lmingw32 -lSDLmain -lSDL -lSDL_image -lSDL_net -lSDL_ttf -lftgl -llibfreetype -lopengl32 -lglu32
我正在将 Eclipse 与 MinGW 一起使用。
我已经复制粘贴了
-
src/FTGL文件夹和 - freetype 库的
Include文件夹的内容
到MinGW目录的include文件夹。
freetype2(有freetype.lib,freetype248_D.lib和freetype-bcc.lib,不确定在项目属性中链接)和ftgl(ftgl.dll,ftgl_D.lib,ftgl_static_D.lib)lib文件到MinGW目录对应的lib文件夹。
如果我点击有错误的行并使用 Open Declaration 选项,eclipse 会将我带到 FTTextureFont 头文件,其中定义了 FTTextureFont(char const*) 和 MakeGlyph 函数。
如果您想查看更多内容或作为参考,您可以在GetRandomGame project page 上找到完整代码。
这是编译器版本
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.6.1/lto-wrapper.exe
Target: mingw32
Configured with: ../gcc-4.6.1/configure --enable-languages=c,c++,fortran,objc,ob
j-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp -
-disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runti
me-libs --build=mingw32 --prefix=/mingw
Thread model: win32
gcc version 4.6.1 (GCC)
编辑
类似问题:FTGL undefined references everywere?,但是那个问题的答案并没有解决我的问题,我仍然得到这两个错误。
编辑 2
我第一次尝试使用 FTGL 时正在使用 MSVC 进行编译,但出现了两个错误。
我最终使用 code::block 来导入两个库提供的 MSVC 项目。两个错误之一得到了解决!但是,我还是得到了这个:
The type 'FTTextureFont' must implement the inherited pure virtual method 'FTFont::MakeGlyph'
编辑 3
我尝试使用 freetype 2.3.4 编译 FTGL 2.1.2,但这并没有解决我的问题。我已经尝试过使用 freetype 2.3.4 的 FTGL 2.1.3 rc5,同样的事情。可以肯定的是,我也尝试过 freetype 2.3.5 和 2.4.8(第一次已经是 2.4.8)。
我已经尝试将MakeGlyph 代码移动到头文件中,但这并没有解决问题。
这是我找到的一些有用的链接,但它们还没有解决问题。
编辑 4
当我删除 ftgl 链接器标志时,编译器会抱怨:
undefined reference to FTPixmapFont::FTPixmapFont(char const*)'
collect2: ld returned 1 exit status
Build error occurred, build is stopped
我仍然得到纯虚方法MakeGlyph 错误。
使用ftgl 链接器标志,我得到的唯一错误是“必须实现继承的纯虚拟方法 MakeGlyph”。编译器可以很好地构建项目(但在启动时崩溃):
-lmingw32 -lSDLmain -lSDL -lSDL_image -lSDL_net -lSDL_ttf -lfreetype -lftgl -lopengl32 -lglu32
Build complete for project GetRandomGame
所以我认为 FTGL 库没有正确编译,因为它应该有 FTPixmapFont.cpp 定义纯虚拟方法 MakeGlyph。我对 c++ 中的所有这些 lib 的东西有点陌生,我可能在构建 lib 时做错了什么。
编辑 5
我在一个示例中阅读并看到我需要一个config.h 文件,因此我添加了一个正确配置的config.h FTGL 附带的文件。
然后我在ftgl 目录中提供的示例中找到了以下代码,并将其添加到我的Font 类中。
class FTHaloFont : public FTFont
{
public:
FTHaloFont(char const *fontFilePath) : FTFont(fontFilePath) {}
protected:
virtual FTGlyph* MakeGlyph(FT_GlyphSlot slot)
{
return new FTHaloGlyph(slot);
}
};
即使我在那里定义了MakeGlyph,Eclipse 也会抱怨一个未实现的纯虚方法FTFont::MakeGlyph。
编辑 6
我尝试使用 gdb 从命令行进行调试,它告诉我找不到 freetype6.dll。我现在正在努力寻找解决方案。
【问题讨论】:
-
如果您尽可能制作最小的示例来重现您的问题,包括传递给 makefile、编译器和/或链接器的参数,您会更快地获得帮助。您在此处展示的内容可能存在许多问题,如果没有完整的信息,就无法告诉您它们是什么。 FWIW,MSVC 不链接到 DLL,需要 .lib 文件。该规则有一些例外,但您的情况并非如此。
-
等等。您使用 VC2010 编译了 FreeType2 和 FTGL,但您使用 Eclipse 作为您的 IDE。这究竟是如何工作的?
-
@NicolBolas 我将尝试使用 MinGW 用 eclipse 编译这两个库,看看它是否可以解决问题。
-
使用 MinGW 编译两个库后(在代码::块中)我仍然得到最后一个错误...
-
制作产生该问题的简单测试应用程序,将其打包到存档中(连同构建脚本/makefile、ftgl 和 freetype)并上传到某个地方。有人可能会看看它。还将编译器/库版本添加到问题中。
标签: c++ eclipse opengl pure-virtual ftgl