gtkmm 未定义引用某些 gtk::builder 函数 add_from_file
gtkmm undefined reference to certain gtk::builder function add_from_file
我正在使用 eclipse、mingw-w64、gtkmm2.4、glade 来编译一些简单的程序。
我可以编译hello world gtkmm examples,按照教程来,但是当涉及到glade时出现了一个有点奇怪的undefined to error。
顺利编译运行的程序,就是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;
}
然而,当我尝试 运行 空地章节 (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<char, std::char_traits<char>, std::allocator<char> > const&)'
它似乎将参数 "something.glade" 作为类型 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&
(我不知道它是什么)。
根据 gtkmm 手册(https:developer.gnome.org/gtkmm/stable/classGtk_1_1Builder.html#aa3f4af4e7eaf7861c8283dc0dbd5254c)似乎只需要 Gtk::Builder::add_from_file(const std::string & filename)
。那么参数类型真的是问题所在吗?
我尝试通过 std::string()
或 string()
将其转换为 std::string,但它给出了相同的错误。
我已经尝试注释掉有问题的行,并且编译正常。
Gtk::Builder::create()
未收到编译错误的未定义引用
refBuilder->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 位
似乎 解决了。
把#define _GLIBCXX_USE_CXX11_ABI 0
放在开始因为我使用的是gcc 5.
我正在使用 eclipse、mingw-w64、gtkmm2.4、glade 来编译一些简单的程序。
我可以编译hello world gtkmm examples,按照教程来,但是当涉及到glade时出现了一个有点奇怪的undefined to error。
顺利编译运行的程序,就是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;
}
然而,当我尝试 运行 空地章节 (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<char, std::char_traits<char>, std::allocator<char> > const&)'
它似乎将参数 "something.glade" 作为类型 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&
(我不知道它是什么)。
根据 gtkmm 手册(https:developer.gnome.org/gtkmm/stable/classGtk_1_1Builder.html#aa3f4af4e7eaf7861c8283dc0dbd5254c)似乎只需要 Gtk::Builder::add_from_file(const std::string & filename)
。那么参数类型真的是问题所在吗?
我尝试通过 std::string()
或 string()
将其转换为 std::string,但它给出了相同的错误。
我已经尝试注释掉有问题的行,并且编译正常。
Gtk::Builder::create()
未收到编译错误的未定义引用refBuilder->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 位
似乎
把#define _GLIBCXX_USE_CXX11_ABI 0
放在开始因为我使用的是gcc 5.