将gtkmm2应用程序部署到Windows - 字体无法从mingw终端

时间:2018-04-02 20:19:32

标签: c++ deployment mingw gtkmm

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

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

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

https://imgur.com/WkoiN3v

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

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

在部署应用程序中找到所有相关.dll和支持文件后,或者字体无法正常呈现。

当我从Windows命令行运行app时,我得到了这个:

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”代码,只是为了在编写预期的应用程序之前端到端地测试概念。

1 个答案:

答案 0 :(得分:0)

我设法让字体渲染工作,通过一些横向思维,但我仍然感到困惑该怎么做。

由于设置(企业约束)的细节,我认为USERPROFILE或HOMEDRIVE或HOMEPATH正在扮演角色(因为~/.gtkrc-2.0设置)。但事实证明它并没有产生任何影响。

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

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

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

  

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

但这是向前迈出的一步:)

<强>更新

想出了另外两个预计将包含在部署中的库,但仍不足以解决字体问题。以下库可以通过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成语的人而言,#/;&#39;表示你的用户文件夹。在Windows(例如windows 7)上,这将是c:\ Users \ YourWindowsUserName,因此windows上的自定义文件是:c:\用户\ YourWindowsUserName.gtkrc-2.0)