将 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?