c++ - 使用 MinGW 编译并安装 FTGL lib 以在 OpenGL 中渲染文本

标签 c++ eclipse opengl pure-virtual ftgl

语境

我正在使用 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库
  • 文件夹的内容

    到 MinGW 目录的 Include 文件夹。

    freetype2(有 includefreetype.libfreetype248_D.lib ,不确定是否在项目属性中链接)和 ftgl( freetype-bcc.libftgl.dllftgl_D.lib 、 libx914 对应的 libx914 文件夹中的 libx914 文件夹中的 libx914 文件夹)。

    如果我单击有错误的行并使用 Open Declaration 选项,eclipse 会将我带到 ftgl_static_D.lib 头文件,其中定义了 FTTextureFont 并定义了 FTTextureFont(char const*) 函数。

    如果您想查看更多内容或作为引用,可以在 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,但这并没有解决我的问题。我试过 FTGL 2.1.3 rc5 和 freetype 2.3.4,同样的事情。可以肯定的是,我也尝试过 freetype 2.3.5 和 2.4.8(第一次已经是 2.4.8)。

    我尝试将 MakeGlyph 代码移动到头文件中,但这并没有解决问题。

    这是我找到的一些有用的链接,但它们还没有解决问题。
  • OpenGL font rendering with FTGL
  • Glut and FTGL


  • 编辑 4

    当我删除 MakeGlyph 链接器标志时,编译器会提示这个:

    undefined reference to FTPixmapFont::FTPixmapFont(char const*)'
    collect2: ld returned 1 exit status
    Build error occurred, build is stopped
    

    而且我仍然得到纯虚方法 ftgl 错误。

    使用 MakeGlyph 链接器标志,我得到的唯一错误是“必须实现继承的纯虚拟方法 MakeGlyph”。编译器很好地构建项目(但在启动时崩溃):

    -lmingw32 -lSDLmain -lSDL -lSDL_image -lSDL_net -lSDL_ttf -lfreetype -lftgl -lopengl32 -lglu32
    Build complete for project GetRandomGame
    

    所以我认为 FTGL 库没有正确编译,因为它应该有 ftgl 定义纯虚拟方法 FTPixmapFont.cpp 。我对 C++ 中的所有这些 lib 东西都很陌生,我可能在构建 lib 时做错了什么。

    编辑 5

    我已经阅读并在一个示例中看到我需要一个 MakeGlyph 文件,因此我添加了一个正确配置的 FTGL 附带的 config.h 文件。

    然后我在 config.h 目录中提供的示例中找到了以下代码,并将其添加到我的 ftgl 类中。
    class FTHaloFont : public FTFont
    {
        public:
            FTHaloFont(char const *fontFilePath) : FTFont(fontFilePath) {}
    
        protected:
            virtual FTGlyph* MakeGlyph(FT_GlyphSlot slot)
            {
                return new FTHaloGlyph(slot);
            }
    };
    

    即使我在那里定义了 Font ,Eclipse 也会提示一个未实现的纯虚方法 MakeGlyph

    编辑 6

    我试过用 gdb 从命令行调试,它告诉我找不到 freetype6.dll。我现在正在努力寻找解决方案。

    最佳答案

    编译器告诉你方法 FTTextureFont::MakeGlyph还没有写。

    您必须:

  • 继承自 FTTextureFont并写下 MakeGlyph方法。
  • 查找 FTTextureFont 的子类这就是你想要的。

  • 根据 FTGL 文档,从 FTFont 派生的任何类(其中 FTTextureFont 作为父级)必须实现 MakeGlyph .

    我会在网上寻找代码,看看其他人做了什么。

    关于c++ - 使用 MinGW 编译并安装 FTGL lib 以在 OpenGL 中渲染文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9347926/

    相关文章:

    c++ - 具有重载名称的模板化方法

    Java包/类库约定?

    java lwjgl 在当前线程中找不到 OpenGL 上下文

    c++ - OpenGL(使用 SOIL)总是加载相同的图像

    c++ - 无法设置 CWinApp 上的 SetTimer 函数

    c++ - 不使用构造函数初始化priority_queue

    eclipse - 是否可以在 Eclipse 中处理远程文件?

    java - 如何设置 Eclipse 控制台语言环境/语言

    c++ - 计算给定轨道偏心率和距中心点的顶点的椭圆

    c++ - 尝试在 OpenGL/SFML 中实现鼠标外观 "camera"