web-dev-qa-db-ja.com

gtk /gtk.hがUbuntuc ++で見つかりません

私はプログラミングにかなり慣れていません。特に、ライブラリや同様のアクティビティを含める方法に関してはそうです。私は過去にPythonを使用して少しプログラミングし、GTKを使用してウィンドウを作成しました。これはc ++でプログラミングするときにも行うことを意図したものです。始めるために、ここに私のコードがあります:

_#include <stdlib.h>
#include <gtk/gtk.h>

static void helloWorld (GtkWidget *wid, GtkWidget *win)
{
  GtkWidget *dialog = NULL;

  dialog = gtk_message_dialog_new (GTK_WINDOW (win), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "Hello World!");
  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
  gtk_dialog_run (GTK_DIALOG (dialog));
  gtk_widget_destroy (dialog);
}

int main (int argc, char *argv[])
{
  GtkWidget *button = NULL;
  GtkWidget *win = NULL;
  GtkWidget *vbox = NULL;

  /* Initialize GTK+ */
  g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, (GLogFunc) gtk_false, NULL);
  gtk_init (&argc, &argv);
  g_log_set_handler ("Gtk", G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);

  /* Create the main window */
  win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_default_size(GTK_WINDOW (win), 400, 300);
  gtk_container_set_border_width (GTK_CONTAINER (win), 8);
  gtk_window_set_title (GTK_WINDOW (win), "test");
  gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
  gtk_widget_realize (win);
  g_signal_connect (win, "destroy", gtk_main_quit, NULL);

  /* Create a vertical box with buttons */
  vbox = gtk_vbox_new (TRUE, 6);
  gtk_container_add (GTK_CONTAINER (win), vbox);

  button = gtk_button_new_from_stock (GTK_STOCK_DIALOG_INFO);
  g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (helloWorld), (gpointer) win);
  gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);

  button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
  g_signal_connect (button, "clicked", gtk_main_quit, NULL);
  gtk_box_pack_start (GTK_BOX (vbox), button, TRUE, TRUE, 0);

  /* Enter the main loop */
  gtk_widget_show_all (win);
  gtk_main ();
  return 0;
}
_

コードは、しばらく前にインターネットで見つけた「Helloworld」の例から取られました。

この問題はすでに答えを得ていることを私は知っていますが、私の状況ははるかに複雑です(少なくとも私の観点からは)。まず、必要なすべてのパッケージをインストールしました。ちなみに私はUbuntu14.04を実行しています。

_g++ main.cpp_を使用してコードをコンパイルすると、次のエラーが発生します。

_main.cpp:2:21: fatal error: gtk/gtk.h: No such file or directory
 #include <gtk/gtk.h>
                     ^
compilation terminated.
_

この特定のエラーには修正があります。これは、コンパイルコマンドを次のように拡張することです:_g++ main.cpp -I/usr/include/gtk-2.0_。ただし、これにより、別の同様のエラーが発生します。

_In file included from /usr/include/gtk-2.0/gdk/gdk.h:32:0,
                 from /usr/include/gtk-2.0/gtk/gtk.h:32,
                 from main.cpp:2:
/usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h:30:21: fatal error: gio/gio.h: No such file or directory
 #include <gio/gio.h>
                     ^
compilation terminated.
_

次のようにコマンドを拡張することで、これを修正することもできます(すべてのコマンドはインターネット上で資金提供されており、すべてを完全には理解していません):g++ -g -Wall -c -o program.o main.cpp -I/usr/include/gtk-2.0 $(pkg-config --libs --cflags glib-2.0)。 _cairo.h_でエラーが発生します。

ご覧のとおり、同様のエラーがあります。何が悪いのかわかりませんが、比較的簡単な修正があると信じなければなりません。

また、Ubuntuの新規インストール(インストールされたパッケージのみが必要)を試しましたが、同じエラーが発生します。

7
Xweque

pkgconfigコマンドは、特定のパッケージをインクルードするときに、コンパイラーに必要なすべての-I(インクルード)および-l(リンカー)ステートメントを提供します。

実行することによって与えられるものを見てください:

pkgconfig --cflags --libs gtk+-2.0

Ubuntu 14.04.1でコードをコンパイルしようとしましたが、次のコマンドを使用すると問題なく動作しました。

g++ main.cpp `pkg-config --cflags --libs gtk+-2.0`

おそらくpkg-config --libs --cflags glib-2.0は、必要なすべてのインクルードパスと共有ライブラリを提供するのに十分ではありませんでした。

12
doubleud

それは作品です(Ubuntu):

export CPATH=$CPATH:/usr/include/gtk-2.0
export CPATH=$CPATH:/usr/include/glib-2.0/
export CPATH=$CPATH:/usr/lib/glib-2.0/include/
export CPATH=$CPATH:/usr/include/pango-1.0/
export CPATH=$CPATH:/usr/lib/gtk-2.0/include/
export CPATH=$CPATH:/usr/include/atk-1.0/

Fedora> = 25の場合:

export CPATH=$CPATH:/usr/include/gtk-3.0
export CPATH=$CPATH:/usr/include/glib-2.0/
export CPATH=$CPATH:/lib64/glib-2.0/include/
export CPATH=$CPATH:/usr/include/pango-1.0/
export CPATH=$CPATH:/usr/lib64/gtk-3.0/3.0.0/
export CPATH=$CPATH:/usr/include/atk-1.0/
export CPATH=$CPATH:/usr/include/cairo/

~/.bashrcまたは~/.zshrc

実行することを忘れないでください:source ~/.bashrc

1
anlijudavid

Ubuntuにファイルがインストールされていない場合、移動先は http://packages.ubuntu.com で、secondフォームを検索してファイル名を探します。

この場合 の場合、答えは(fortrusty):です。

File                                                Package
-----------------------------------------------------------------
/usr/include/gtk-2.0/gtk/gtk.h                      libgtk2.0-dev
/usr/include/gtk-3.0/gtk/gtk.h                      libgtk-3-dev
/usr/lib/R/site-library/RGtk2/include/RGtk2/gtk.h   r-cran-rgtk2

どれが最適かを選択してインストールする必要があります。

私はこれを推測しています: libgtk2.0-dev

その後、gio/gio.hヘッダーファイルに対してこのプロセスを繰り返すことができます。

1
ams

また、PythonからC++に移行しましたが、C++に作業方法が含まれていることに慣れていません。C++での作業を楽にするために行うことは次のとおりです。次の内容でMakefileを作成します。 :

all:
     g++-5 main.cpp -o main `pkg-config --libs --cflags gtkmm-3.0`

main.cppの代わりに、すべての*.cppファイルとheadersを含めます。 (また、私はgtkmm-3.0を使用していることに注意してください)そしてgtkmm-3.0では、1つのウィンドウ、1つのボタン、および関数にリンクされているボタンを備えたアプリケーション[Hello World!もちろん]このようになります

#include <iostream>
#include <gtkmm/application.h>
#include <gtkmm/window.h>
#include <gtkmm/button.h>


class HelloWorld : public Gtk::Window{

public:
  HelloWorld();
  virtual ~HelloWorld();

protected:
  //Signal handlers:
  void on_button_clicked();

  //Member widgets:
  Gtk::Button m_button;
};

// implementing the class HelloWorld
HelloWorld::HelloWorld(): m_button("Click me, Xweque"){
 set_border_width(20); // Sets the border width of the window.

// Connecting the button's clicked signal to an arbitrary function
m_button.signal_clicked().connect(sigc::mem_fun(*this, &HelloWorld::on_button_clicked));

add(m_button);
m_button.show();
}

HelloWorld::~HelloWorld()
{
}

void HelloWorld::on_button_clicked(){
  std::cout << "Hello World" << std::endl;
}


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

HelloWorld mywindow;
app->run(mywindow);

return 0;
}
0
moldovean