Erro ao compilar gtkmm-2.4[RESOLVIDO]

Iniciado por Diego_Rocha, 06 de Maio de 2007, 23:37

tópico anterior - próximo tópico

Diego_Rocha

Pessoal é o seguinte estou começando a aprender gtkmm, só que estou com o seguinte problema para compilar esse codigo,


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

int main(int argc, char **argv)
{
Gtk::Main main(argc, argv);
Gtk::Window janela;
Gtk::Main::run(janela);
}


me sai esse erro


/~$ g++ teste.cpp -o teste `pkg-config gtkmm-2.4 --cflags --libs`
/usr/lib/gcc/i486-slackware-linux/3.4.6/../../../../i486-slackware-linux/bin/ld: warning: libstdc++.so.5, needed by /usr/lib/gcc/i486-slackware-linux/3.4.6/../../../libgtkmm-2.4.so, may conflict with libstdc++.so.6
root@rocha:~# removepkg cxxlibs-5.0.7-i486-1.tgz



alguem tem ideia do que seja??

***Ai pessoal consegui resolver, instalei a versão mais recente do gcc e do binutils e agora compila, so que tenho outro problema, o que tem de errado nesse codigo???


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

using namespace std;

class MyApp : public Gtk::Window
{
public:
MyApp();
virtual ~MyApp();
protected:
Gtk::Button m_button;
virtual void botao_clicado();
};

MyApp::MyApp() : m_button("Clique Aqui")
{
set_title("Hello World");
set_border_width(15);
set_default_size(250, 125);
add(m_button);
m_button.signal_clicked().connect( sigc::slot ( *this, &MyApp::botao_clicado ) );
show_all_children();
}

MyApp::~MyApp()
{
}

void MyApp::botao_clicado()
{
cout <<"Hello World\n";
}

int main(int argc, char **argv)
{
Gtk::Main kit(argc, argv);

MyApp App;
Gtk::Main::run(App);
return 0;
}


Quando compilo sai isso


:~$ g++ teste.cpp -o teste `pkg-config --cflags --libs gtkmm-2.4`
teste.cpp: In constructor 'MyApp::MyApp()':
teste.cpp:22: error: missing template arguments before '(' token

Diego_Rocha

Já resolvi o Problema, o erro estava na versão do sigc++, como minha versão é recente a função " se é que pode chamar assim ", sigc::slot, foi trocada por sigc::mem_fun e agora compilou de boa é isso ai t++

m_button.signal_clicked().connect( sigc::mem_fun ( *this, &MyApp::botao_clicado ) );

Darcamo

Já programei com a gtkmm e nunca usei sigc::slot.
Na verdade sigc::sloc não é uma função, mas uma classe. Quando você escreveu "sigc::slot ( *this, &MyApp::botao_clicado )" é como se estivesse criando um novo objeto dessa classe chamando o construtor, mas essa classe é um template. Daí a reclamação do compilador.

Você deve usar sigc::mem_fun quando deseja utilizar funções membro de alguma classe como callback, e sigc::ptr_fun quando deseja utilizar funções static ou funções de C como callback. Ambas, sigc::mem_fun e sigc::ptr_fun retornam um sigc::slot que é então passado para a função "connect" que vai conectar esse slot ao sinal.

Ps: aconselho a ler o tutorial da libsigc++ (http://libsigc.sourceforge.net/doc.shtml). Você vê isso na documentação da gtkmm, mas eu achei mais claro ver primeiro o tutorial da libsigc++ (basta até o cap. 2) e só depois ir pra gtkmm. Lembro que fiquei confuso com essa história de mem_fun, slot e ptr_fun quando estava lendo a documentação da gtkmm. Só depois de ler o tutorial da libsigc++ é que tudo ficou claro.

Diego_Rocha

Obrigado mais uma vez Darcamo, vc sempre me ajudando e ajudando a todos em C++ valeu, estou iniciando um blog a respeito de Gtkmm, 1° pelo motivo de ter pouco material em portugues e segundo pelo motivo de me dar mais motivação no aprendizado, ao buscar conteudo para colocar no blog vc indiretamente acaba aprendendo mais e fazendo o aprendizado ser mais suave, se voce se interessar em participar sera muito bem-vindo como todos os que quiserem participar, é isso ai obrigado mais uma vez, e t++

Darcamo

Com certeza.
Eu estou meio enferrujado na gtkmm, então tentar tirar dúvidas sobre gtkmm é uma boa maneira de relembrar.

Darcamo

Nunca usei, mas parece que tem um widget para GTK chamada vte que é exatamente isso: um terminal

Tem também o bind para gtkmm: vtemm
http://vtemm.sourceforge.jp/

Vê é isso que você quer.

Diego_Rocha

Citação de: jniltinho online 08 de Maio de 2007, 16:55
Citação de: Darcamo online 08 de Maio de 2007, 12:11
Com certeza.
Eu estou meio enferrujado na gtkmm, então tentar tirar dúvidas sobre gtkmm é uma boa maneira de relembrar.


Como eu faz para utilizar comando Shell linux no Gtkmm.
Pois gostaria aos poucos migrar o Taizan para Gtkmm, pois o C++ é mais rapido que python né.

E tambem conhecer uma linguagem nova, como o C++ misturado com Gtkmm.

Agradeço por qualquer informação obtida. Obrigado !


Só uma duvida jniltinho não me leve a mau, mais ate um tempinho atraz voce tinha acabado de mudar o taizan de shell script para pygtk, junto com o _luks, então te pergunto qual o motivo de mudar novamente de linguagem??  e a respeito de C++ ser mais rapido, acho relativo seu programa não vai ser um consumidor de recursos do pc por isso acho que a diferença de desempenho não vai ser perceptivel; mais se o motivo que te leva a mudar o taizan para C++ é aprendizado, seja bem vindo, eu tambem acabo de entrar nessa aventura;