Problems compiling GTK3

27 Views Asked by At

i am having problems with compiling GTK3 programs with GCC.

I am using Code:Blocks 20.03, and GCC version 13.1.0.

I was able to compile normally on other computer, but this computer is giving me this error:

multiple definition of `DllMain'; C:/msys64/mingw64/lib\libgtk-3.a(gtkwin32.c.obj):(.text+0x40): first defined here

And a bunch of undefined reference errors, like this one:

undefined reference to `__imp_g_free'

What is causing this error? I couldnt find the culprit.

Here is the source code of the program i am trying to compile

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

/*
Esta e uma calculadora de gastos com um carro
O programa deve:

Receber o rendimento em km/litro de um carro
Receber a distância em km de uma viagem
Receber o valor em reais da gasolina

Devolver o valor gasto em reais da viagem
Devolver quantos litros foram gastos

Possuir uma interface gráfica, que permita a inserção dos valores do usuário
*/



//Estrutura base
struct estrutura_base{
    float rendimento;
    float distancia;
    float valor_gasolina;

    float valor_gasto;
    float litros_gastos;
};

struct estrutura_interface{
    GtkWidget *janela;
    GtkWidget *entrada_rendimento;
    GtkWidget *entrada_distancia;
    GtkWidget *entrada_gasolina;
    GtkWidget *label_exibir_consumo;
    GtkWidget *label_valor_gasto;
    GtkWidget *botao_calcular;
    GtkWidget *botao_limpar;

    struct estrutura_base valores;
};

//Funções do programa
int inicializar_estrutura(struct estrutura_base *estrutura);
int construtor(struct estrutura_interface *interface);
GtkWidget* criar_widget(GtkWidget *objeto, GtkBuilder *construtor, char *nome);
static void funcao_calcular(struct estrutura_interface *interface);
static void funcao_limpar(struct estrutura_interface *interface);

int main(int argc, char **argv)
{
    struct estrutura_interface *interface;
    struct estrutura_base *estrutura;

    interface = malloc(sizeof(interface));
    estrutura = malloc(sizeof(estrutura));

    if(inicializar_estrutura(estrutura)==FALSE)
    {
        printf("Erro! Estrutura nao inicializada!\n");
        return FALSE;
    }

    gtk_init(&argc, &argv);

    if(construtor(interface)==FALSE)
    {
        printf("Erro! Erro nº %i, do tipo: %s", errno, strerror(errno));
        return TRUE;
    }

    gtk_main();

    free(estrutura);
    free(interface);

    return 0;
}

int inicializar_estrutura(struct estrutura_base *estrutura)
{
    printf("Inicializando...\n");
    estrutura->distancia = 0;
    estrutura->litros_gastos = 0;
    estrutura->rendimento = 0;
    estrutura->valor_gasolina = 0;
    estrutura->valor_gasto = 0;

    return TRUE;
}

int construtor(struct estrutura_interface *interface)
{
    GtkBuilder *construtor = NULL;

    construtor = gtk_builder_new_from_file("interface.glade");

    if(construtor==NULL)
    {
        printf("Erro! Estrutura nao inicializada!\n");
        return FALSE;
    }

    interface->janela = criar_widget(interface->janela,construtor,"janela");
    interface->entrada_rendimento = criar_widget(interface->entrada_rendimento,construtor,"entrada_rendimento");
    interface->entrada_distancia = criar_widget(interface->entrada_distancia,construtor,"entrada_distancia");
    interface->entrada_gasolina = criar_widget(interface->entrada_gasolina,construtor,"entrada_gasolina");
    interface->label_exibir_consumo = criar_widget(interface->label_exibir_consumo,construtor,"label_exibir_consumo");
    interface->label_valor_gasto = criar_widget(interface->label_valor_gasto,construtor,"label_valor_gasto");
    interface->botao_calcular = criar_widget(interface->botao_calcular,construtor,"botao_calcular");
    interface->botao_limpar = criar_widget(interface->botao_limpar,construtor,"botao_limpar");

    g_signal_connect(interface->janela,"destroy", G_CALLBACK(gtk_main_quit),NULL);
    g_signal_connect_swapped(interface->botao_calcular,"clicked",G_CALLBACK(funcao_calcular),interface);
    g_signal_connect_swapped(interface->botao_limpar,"clicked",G_CALLBACK(funcao_limpar),interface);

    gtk_widget_show_all(interface->janela);

    return TRUE;
}

//funcao para criar os widgets a partir do construtor
GtkWidget* criar_widget(GtkWidget *objeto, GtkBuilder *construtor, char *nome)
{
    objeto = GTK_WIDGET(gtk_builder_get_object(construtor, nome));

    if(objeto==NULL)
    {
        printf("Erro! Erro nº %i, do tipo: %s", errno, strerror(errno));
        return NULL;
    }


    return objeto;
}

static void funcao_calcular(struct estrutura_interface *interface)
{
    printf("Apertou!\n");

}

static void funcao_limpar(struct estrutura_interface *interface)
{
    printf("Apertou!\n");

}
0

There are 0 best solutions below