Пример gtkmm3 не компилируется (неопределенная ссылка)

Я пытаюсь скомпилировать следующий пример

#include <gtkmm.h>

int main(int argc, char *argv[])
{
  Glib::RefPtr<Gtk::Application> app =
    Gtk::Application::create(argc, argv,
      "org.gtkmm.examples.base");

  Gtk::Window window;
  window.set_default_size(200, 200);

  return app->run(window);
}

я использую эту команду: g++ ./gtk.cpp -o ./gtk -Wall pkg-config gtkmm-3.0 --cflags --libs и получаю это сообщение об ошибке: /usr/local/lib/libatk-1.0.so: undefined reference to 'g_type_check_instance_is_fundamentally_a' collect2: error: ld returned 1 exit status как я могу это исправить?


person Tony    schedule 18.04.2015    source источник
comment
Я думаю, вы пропустили опцию -l, что-то вроде -lgtkmm. Я просто не могу найти бинарники gtkmm3.   -  person gomons    schedule 18.04.2015


Ответы (1)


Использовать этот:

g++ ./gtk.cpp -o ./gtk -Wall `pkg-config gtkmm-3.0 --cflags --libs`

Вам нужно добавить `до и после команды pkg-config.

pkg-config дает вам флаги для компилятора, и они должны быть переданы как параметр компилятора (вывод pkg-config, но не той же самой команды pkg-config).

Добавление символа ` приводит к тому, что вывод команды pkg-config добавляется в компилятор в качестве параметра.

Вы можете просто визуализировать эту разницу, используя эхо:

$ echo pkg-config gtkmm-3.0 --cflags --libs
pkg-config gtkmm-3.0 --cflags --libs

$ echo `pkg-config gtkmm-3.0 --cflags --libs`
-pthread -I/usr/include/gtkmm-3.0 -I/usr/lib/x86_64-linux-gnu/gtkmm-3.0/include -I/usr/include/giomm-2.4 -I/usr/lib/x86_64-linux-gnu/giomm-2.4/include -I/usr/include/gtk-3.0 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/gtk-3.0/unix-print -I/usr/include/gdkmm-3.0 -I/usr/lib/x86_64-linux-gnu/gdkmm-3.0/include -I/usr/include/atk-1.0 -I/usr/include/glibmm-2.4 -I/usr/lib/x86_64-linux-gnu/glibmm-2.4/include -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/sigc++-2.0 -I/usr/lib/x86_64-linux-gnu/sigc++-2.0/include -I/usr/include/pango-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/gio-unix-2.0/ -I/usr/include/atkmm-1.6 -I/usr/include/pangomm-1.4 -I/usr/lib/pangomm-1.4/include -I/usr/include/cairomm-1.0 -I/usr/lib/cairomm-1.0/include -lgtkmm-3.0 -latkmm-1.6 -lgdkmm-3.0 -lgiomm-2.4 -lpangomm-1.4 -lgtk-3 -lglibmm-2.4 -lcairomm-1.0 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lsigc-2.0 -lgobject-2.0 -lglib-2.0
person jmmk    schedule 19.04.2015
comment
да, я сделал это, я просто не знал, как их избежать и вставить в вопрос - person Tony; 19.04.2015
comment
нет, это не так. я получаю эту ошибку и не знаю, почему - person Tony; 20.04.2015
comment
убедитесь, что у вас установлен libatk версии 1.0 sudo apt-get install libatk1.0 - person jmmk; 20.04.2015
comment
Какой это дистрибутив (и версия)? - person murrayc; 21.04.2015
comment
@murrayc it's Mint 17.1 Rebecca — Cinnamon (32-битная версия) - person Tony; 21.04.2015
comment
Где библиотека? Попробуйте найти его: найдите libatk-1.0, а затем sudo ln -f -s /usr/path_where_it_is_located /usr/local/lib/libatk-1.0.so - person jmmk; 21.04.2015
comment
Тони, тогда это похоже на проблему с пакетом Mint. Я предлагаю вам также попробовать простую программу hello world на GTK+ C. - person murrayc; 24.04.2015
comment
@jmmk найти libatk-1.0 вывод: /usr/lib/i386-linux-gnu/libatk-1.0.so /usr/lib/i386-linux- gnu/libatk-1.0.so.0 /usr/lib/i386-linux-gnu/libatk-1.0.so.0.21009.1 /usr/local/lib/ libatk-1.0.la /usr/local/lib/libatk-1.0.so /usr/local/lib/libatk-1.0.so.0 < i>/usr/local/lib/libatk-1.0.so.0.21512.1 - person Tony; 25.04.2015
comment
@murrayc, компилирующий простой пример GTK+ C, дает мне ту же ошибку : /usr/local/lib/libatk-1.0.so: неопределенная ссылка на `g_type_check_instance_is_fundamentally_a' - person Tony; 25.04.2015
comment
@Tony Тогда это похоже на проблему с пакетом GTK+ (или atk) в Mint. Я предлагаю вам сообщить об этом в Минт. Кажется странным, что такой фундаментальный пакет был сломан, но я думаю, что упаковщики Mint были бы лучшими людьми, которые могли бы помочь с этим. - person murrayc; 25.04.2015