将 gtkmm2 应用程序部署到 Windows - 字体未从 mingw 终端呈现

Posted

技术标签:

【中文标题】将 gtkmm2 应用程序部署到 Windows - 字体未从 mingw 终端呈现【英文标题】:deploy gtkmm2 application to windows - fonts not rendering out of mingw terminal 【发布时间】:2018-04-02 20:19:32 【问题描述】:

我遇到了一个特殊的问题。做了很多研究,但找不到任何提示我可以尝试做些什么来解决这个问题。

我所做的是编写一个非常简单的示例,使用 glade 来呈现应用程序主视图。我在 Linux ubuntu 上试过这个,然后计划使用 msys2 和 mingw32 将代码移植到 Windows。示例是用 GTKmm2 编写的(C++ GTK2(不是 GTK3))经过大量移植后,我设法在 windows 下编译示例。

结果如下(因为很难描述我附上图片):

https://imgur.com/WkoiN3v

这是从 mingw32 终端窗口启动应用程序时的样子。

现在,我尝试在我打算使用它的窗口的另一部分“导出/部署”该应用程序。基本上是在做部署的POC。

在部署应用程序中找到所有相关的 .dll 和支持文件后开始但字体未正确呈现。

当我从 Windows 命令行运行应用程序时,我得到这个:

https://imgur.com/PWZloIr

我尝试使用 ~/.gtkrc-2.0(之前在 python gtk+ 中使用它)并尝试将默认 gtk 字体设置为 windows 中可用的字体,但它似乎对字体渲染没有任何影响。

我还能尝试做什么?


按照建议...代码:

main.cxx

// #include <gtkmm.h>
#include <gtkmm-2.4/gtkmm.h>

Gtk::Window* window;

static void on_q_button_clicked()

    if(window)
        window->hide(); //hide() will cause main::run() to end.



int main(int argc, char *argv[])

    Gtk::Main kit(argc, argv);
    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("basic.glade");

    builder->get_widget("window1", window);

    Gtk::Button* pButton = 0;
    builder->get_widget("button1", pButton);

    if(pButton)
    
        pButton->signal_clicked().connect( sigc::ptr_fun(on_q_button_clicked) );
    

    Gtk::Main::run(*window);
    return 0;

basic.glade

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk+" version="2.24"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkWindow" id="window1">
    <property name="can_focus">False</property>
    <property name="default_width">440</property>
    <property name="default_height">250</property>
    <property name="destroy_with_parent">True</property>
    <child>
      <object class="GtkVBox" id="vbox1">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <child>
      <object class="GtkLabel" id="label1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="label" translatable="yes">Yes!
Always
This is just a text</property>
        <property name="justify">center</property>
      </object>
      <packing>
        <property name="expand">True</property>
        <property name="fill">True</property>
        <property name="position">0</property>
      </packing>
    </child>
    <child>
      <object class="GtkButton" id="button1">
        <property name="label" translatable="yes">click me to close</property>
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <property name="receives_default">True</property>
        <property name="use_action_appearance">False</property>
      </object>
      <packing>
        <property name="expand">True</property>
        <property name="fill">True</property>
        <property name="position">1</property>
      </packing>
    </child>
      </object>
    </child>
  </object>
</interface>

这就是所有的来源。这是一种“hello world”代码,只是为了在编写预期的应用程序之前端到端地测试概念。

【问题讨论】:

能否请您发布您的代码?如果我们可以看到您所做的并尝试重复您的问题,这将有所帮助。顺便说一句,这在 *** 上总是很好的做法。 按照建议、编辑、添加的代码。 我认为问题不在于您的代码。这里有几个问题:您的 glade 文件是否编码为 UTF8?您是否尝试过使用 Windows 中的默认字体/主题?你读过第 1.8 条here吗? 部分解决。见答案。 .glade 文件是在 Ubuntu Linux 上创建的,然后按原样移至 Windows。练习的想法是我在 Ubuntu 上开发,然后将应用程序移植到 Windows,因此,我希望尽可能在两个系统上使用相同的未修改代码。好的,编译和库路径可能略有不同,但我希望任何非操作系统特定的东西都能在两个平台(Lin/Win)上无缝工作。 【参考方案1】:

通过一些横向思考,我设法让字体渲染工作,但我仍然不知道该怎么做。

由于设置的细节(企业限制),我认为 USERPROFILE 或 HOMEDRIVE 或 HOMEPATH 正在发挥作用(因为~/.gtkrc-2.0 设置)。但事实证明,它并没有产生任何影响。

当我添加到 mingw32 bin 文件夹的路径时,字体呈现正确。所以:

SET path=C:\path\to\mingw32\bin;%path%

然后,应用程序正确显示字体。我相信在这次干预之后,~/.gtkrc-2.0 中的字体设置也开始起作用了。

但是,这仍然不能完全部署到目标机器上,因为我仍然不知道什么文件(动态库或 可执行文件)需要从\mingw32\bin 文件夹中渲染字体 目标。我不想依赖于安装 mingw 目标机器只是为了运行应用程序。

但这是一个进步:)

更新:

想出另外 2 个库预计将包含在部署中,但仍不足以解决字体问题。 bin 文件夹中的 main.exe 可以访问以下库:

libgdk-win32-2.0-0.dll libgtk-win32-2.0-0.dll

应可访问的动态库的完整列表是:

libatk-1.0-0.dll libatkmm-1.6-1.dll libbz2-1.dll libcairo-2.dll libcairomm-1.0-1.dll libffi-6.dll libfreetype-6.dll libgcc_s_dw2-1.dll libgdk-win32-2.0-0.dll libgdkmm-2.4-1.dll libgio-2.0-0.dll libgiomm-2.4-1.dll libglib-2.0-0.dll libglibmm-2.4-1.dll libgobject-2.0-0.dll libgraphite2.dll libgtk-win32-2.0-0.dll libgtkmm-2.4-1.dll libharfbuzz-0.dll libiconv-2.dll libintl-8.dll libpango-1.0-0.dll libpangomm-1.4-1.dll libpcre-1.dll libpixman-1-0.dll libpng16-16.dll libsigc-2.0-0.dll libstdc++-6.dll libwinpthread-1.dll zlib1.dll

并且,确认:当路径设置时,样式、字体选择和字体大小用户自定义可以从~/.gtkrc-2.0 正常工作。 (对于没有获得 unix 习惯用法的人,“~/”表示您的用户文件夹。在 Windows(例如 Windows 7)上,这将是 c:\Users\YourWindowsUserName,因此 Windows 上的自定义文件是:c:\Users\YourWindowsUserName.gtkrc- 2.0)

【讨论】:

以上是关于将 gtkmm2 应用程序部署到 Windows - 字体未从 mingw 终端呈现的主要内容,如果未能解决你的问题,请参考以下文章

如何将 elixir 应用程序从 Windows 开发机器部署到 Ubuntu 服务器

如何在 Windows 上使用快速通道将 React Native iOS 应用程序部署到应用商店?

我是不是需要“Linux 的 Windows 子系统”才能将 python 应用程序部署到 Windows 操作系统中的 aws elastic beanstalk?

如何将基于 qt 的应用程序(在 Mac 上开发)部署到 Windows?

将 QT WebKitWidgets 应用程序部署到 Windows XP

我可以在 Linux 服务器上使用 OpenLDAP 将应用程序部署到 Windows 客户端吗?