gtkmm 对某些 gtk::builder 函数 add_from_file 的未定义引用

Posted

技术标签:

【中文标题】gtkmm 对某些 gtk::builder 函数 add_from_file 的未定义引用【英文标题】:gtkmm undefined reference to certain gtk::builder function add_from_file 【发布时间】:2016-09-14 10:01:05 【问题描述】:

我正在使用eclipse、mingw-w64、gtkmm2.4、glade编译一些简单的程序。

我可以按照教程编译 hello world gtkmm 示例,但是当涉及到 glade 时出现了一些奇怪的未定义错误。

编译运行流畅的程序,就是gtkmm 2.24简单示例教程https://developer.gnome.org/gtkmm-tutorial/2.24/sec-basics-simple-example.html.en

#include <gtkmm.h>
#include <iostream>

using namespace std;

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

    Gtk::Main kit(argc, argv);
    Gtk::Window window;
    Gtk::Main::run(*window);
    return 0;

但是,当我尝试运行 glade 章节 (24.2.1) 中的另一个简单示例时,事情并没有解决。

https://developer.gnome.org/gtkmm-tutorial/2.24/sec-builder-accessing-widgets.html.en 示例:

#include <gtkmm.h>
#include <iostream>

using namespace std;

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

    Gtk::Main kit(argc, argv);
    //Gtk::Window window; //I changed it to fit with the glade example

    Gtk::Window* window;  //I changed this line from the example

    //////////////// this part was pretty much just copied out from the example//////
    Glib::RefPtr<Gtk::Builder> refBuilder = Gtk::Builder::create();
    try
      
        refBuilder->add_from_file("something.glade"); //this is the line with problem.
      
      catch(const Glib::FileError& ex)
      
        std::cerr << "FileError: " << ex.what() << std::endl;
        return 1;
      
      catch(const Gtk::BuilderError& ex)
      
        std::cerr << "BuilderError: " << ex.what() << std::endl;
        return 1;
      
    refBuilder->get_widget("window1", window);
    //////////////// end of copied out from the example//////

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

编译后报错如下 test.cpp:(.text.startup+0x281): undefined reference to Gtk::Builder::add_from_file(std::__cxx11::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;)'

似乎将参数“something.glade”作为类型std::__cxx11::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;(我不知道它是什么)。

根据 gtkmm 手册 (https:developer.gnome.org/gtkmm/stable/classGtk_1_1Builder.html#aa3f4af4e7eaf7861c8283dc0dbd5254c) 似乎只需要Gtk::Builder::add_from_file(const std::string &amp; filename)。那么参数类型真的有问题吗?

我尝试通过 std::string()string() 将其转换为 std::string,但它给出了相同的错误。

我已经尝试注释掉有问题的行,它编译得很好。

Gtk::Builder::create() 没有收到未定义的编译错误引用 refBuilder-&gt;get_widget("window1", window); 没有收到未定义的编译错误引用

所以现在我对这个看似微不足道的问题感到头疼。请提供一些帮助。

更多信息

pkg-config --cflags --libs 产生 -IE:/gtkmm64/include/gtkmm-2.4 -IE:/gtkmm64/lib/gtkmm-2.4/include -IE:/gtkmm64/include/atkmm-1.6 -IE:/gtkmm64/include/giomm-2.4 -IE:/gtkmm64/lib/giomm-2.4/include -IE:/gtkmm64/include/pangomm-1.4 -IE:/gtkmm64/lib/pangomm-1.4/include -IE:/gtkmm64/include/gtk-2.0 -IE:/gtkmm64/include/gdkmm-2.4 -IE:/gtkmm64/lib/gdkmm-2.4/include -IE:/gtkmm64/include/atk-1.0 -IE:/gtkmm64/include/glibmm-2.4 -IE:/gtkmm64/lib/glibmm-2.4/include -IE:/gtkmm64/include/glib-2.0 -IE:/gtkmm64/lib/glib-2.0/include -IE:/gtkmm64/include/sigc++-2.0 -IE:/gtkmm64/lib/sigc++-2.0/include -IE:/gtkmm64/include/cairomm-1.0 -IE:/gtkmm64/lib/cairomm-1.0/include -IE:/gtkmm64/include/pango-1.0 -IE:/gtkmm64/include/cairo -IE:/gtkmm64/include -IE:/gtkmm64/include/freetype2 -IE:/gtkmm64/include/libpng14 -IE:/gtkmm64/lib/gtk-2.0/include -IE:/gtkmm64/include/gdk-pixbuf-2.0 -LE:/gtkmm64/lib -lgtkmm-2.4 -latkmm-1.6 -lgdkmm-2.4 -lgiomm-2.4 -lpangomm-1.4 -lgtk-win32-2.0 -lglibmm-2.4 -lcairomm-1.0 -lsigc-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpng14 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl,我已将其包含在项目中 pkg-config --modversion gtkmm2.4 产生了 2.22.0,所以我怀疑它与 add_from_file() 的 2.14 要求有什么关系 pkg-config --modversion gtk+2.0 产生 2.22.0 我没有使用像 --std=c++xx 这样的任何标志。 Windows 8 64 位

【问题讨论】:

【参考方案1】:

似乎Converting std::__cxx11::string to std::string 解决了它。

#define _GLIBCXX_USE_CXX11_ABI 0 放在开头,因为我使用的是 gcc 5。

【讨论】:

以上是关于gtkmm 对某些 gtk::builder 函数 add_from_file 的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

如何在快捷方式窗口中显示快捷方式?

在 Ruby 中使用 GTK3 进度条

无法获取小部件的高度/宽度 - gtkmm

如何在 gtkmm 的另一个线程中运行函数?

实现自定义 Gtkmm 小部件:我应该在虚拟 on_* 函数中返回啥?

GTKMM 监控 I/O 示例 100% CPU 负载