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");
}