Dúvida com erro em código [RESOLVIDO]

1. Dúvida com erro em código [RESOLVIDO]

André
andrezc

(usa Debian)

Enviado em 29/10/2010 - 20:55h

Olá, primeiramente eu tenho dois arquivos, o main.c, que faz a conexão com o banco de dados, e o cadastra.c, que faz o conteúdo do programa. Por enquanto o conteúdo deles é apenas:

main.c:

--------------------
#include <stdio.h>
#include <mysql/mysql.h>
#include "cadastra.c"

int main()
{
MYSQL conexao;

mysql_init(&conexao);
if(mysql_real_connect(&conexao, "localhost","root",
"root", "agenda", 0, NULL, 0))
{
printf("Conectado com sucesso!\n");
cadastra();
mysql_close(&conexao);
}
else
{
printf("Houve uma falha ao tentar conectar! \n");
printf("Erro: %d %s\n",mysql_errno(&conexao),
mysql_error(&conexao));
}
return (0);
}

--------------------

cadastra.c

--------------------
#include <stdio.h>

int cadastra()
{
int opc;

printf("\n\n\t\tMenu:\n");
printf("\t\t--------------\n");
printf("\t\t[1] Inserir\n",
"\t\t[2] Buscar\n",
"\t\t[3] Listar\n",
"\t\t[4] Remover\n",
"\t\t[0] Sair\n",
"\t\t\t>> ");

scanf("%d",&opc);
getchar();

return (0);
}
--------------------

Estou compilando com:

$ gcc main.c cadastra.c -lmysqlclient

E como erro tenho:

/tmp/ccb1WMtQ.o: In function `cadastra':
cadastra.c:(.text+0x0): multiple definition of `cadastra'
/tmp/cc4T11Df.o:main.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status

Não tenho a mínima idéia do que pode ser. Alguém pode me ajudar ?

Outra coisa, para trabalhar com query's SQL na cadastra.c eu preciso declarar a biblioteca do mysql lá ? Pois eu já tenho no main.c.


Grato.


  


2. MELHOR RESPOSTA

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 29/10/2010 - 21:31h

#include "cadastra.c"

Apesar disso funcionar não é nada "bonito" rs
O arquivo cadastra.c deveria ser um cabeçalho (cadastra.h)
Assim:

#ifndef CADASTRA_H
#define CADASTRA_H

#include <stdio.h>

int cadastra()
{
int opc;

printf("\n\n\t\tMenu:\n");
printf("\t\t--------------\n");
printf("\t\t[1] Inserir\n",
"\t\t[2] Buscar\n",
"\t\t[3] Listar\n",
"\t\t[4] Remover\n",
"\t\t[0] Sair\n",
"\t\t\t>> ");

scanf("%d",&opc);
getchar();

return (0);
}

#endif

E no main ao inves de cadastra.c você incluiria cadastra.h Para compilar nem precisaria incluir "cadastra.h" porque a(s) função(ões) do arquivo cadastra.h seria(m) incluidas no main.c


#ifndef CADASTRA_H
#define CADASTRA_H

Isso evita que o compilador inclua mais de uma vez o mesmo cabeçalho.

#endif
Fim da definição de CADASTRA_H, :P

Você poderia compilar tudo em separado e usar a mesma função em outros programas:

-crie um arquivo cadastra.c e o cabeçalho cadastra.h
No cadastra.h ficaria somente as definição da função, antecedido da palavra "extern", que indica que a implementação da função (o corpo) está em um "módulo" separado:

#ifndef CADASTRA_H
#define CADASTRA_H

extern int cadastra();

#endif

//-----------------------
//Segue o cadastra.c
//-----------------------

#include "cadastra.h"

int cadastra()
{
int opc;

printf("\n\n\t\tMenu:\n");
printf("\t\t--------------\n");
printf("\t\t[1] Inserir\n",
"\t\t[2] Buscar\n",
"\t\t[3] Listar\n",
"\t\t[4] Remover\n",
"\t\t[0] Sair\n",
"\t\t\t>> ");

scanf("%d",&opc);
getchar();

return (0);
}


Compilando em separado:
gcc -c cadastra.c

Será gerado um cadastra.o para linkagem estática.
Na compilação do "main" ficaria:
gcc -o main main.c cadastra.o -lmysqlclient

Ainda poderia trasformar o cadastra.o em .so (biblioteca dinamica), só não digo o resto porque falaria demais :P
Valeu!


3. Re: Dúvida com erro em código [RESOLVIDO]

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 29/10/2010 - 21:28h

Fairplay:
Você está construindo seu código um pouco errado.

O jeito "certo" seria criar um arquivo .h com o cabeçalho da função cadastra, um .c que implementa essa cadastra (dando include no .h é claro) e, no main, você inclui o .h.

Seu código ficaria assim:

cadastra.h:
#ifndef CADASTRA_H
#define CADASTRA_H

#include <stdio.h>

// extern informa que o código deve estar disponivel para todos que incluirem o cadastra.h,
// impedindo que a função seja redeclarada. Esse é o erro que o compilador está reclamando :)
extern int cadastra();

#endif

cadastra.c:
#ifndef CADASTRA_C
#define CADASTRA_C

#include "cadastra.h"

int cadastra()
{
int opc;

printf("\n\n\t\tMenu:\n");
printf("\t\t--------------\n");
printf("\t\t[1] Inserir\n",
"\t\t[2] Buscar\n",
"\t\t[3] Listar\n",
"\t\t[4] Remover\n",
"\t\t[0] Sair\n",
"\t\t\t>> ");

scanf("%d",&opc);
getchar();

return (0);
}

#endif

main.c:
#ifndef MAIN_C
#define MAIN_C

#include <stdio.h>
#include <mysql/mysql.h>
#include "cadastra.h"

int main()
{
MYSQL conexao;

mysql_init(&conexao);
if(mysql_real_connect(&conexao, "localhost","root",
"root", "agenda", 0, NULL, 0))
{
printf("Conectado com sucesso!\n");
cadastra();
mysql_close(&conexao);
}
else
{
printf("Houve uma falha ao tentar conectar! \n");
printf("Erro: %d %s\n",mysql_errno(&conexao),
mysql_error(&conexao));
}
return (0);
}

#endif

Para compilar, você vai fazer:
gcc -o cadastra -c cadastra.c (esse comando gera um arquivo cadastra.o, que será utilizado abaixo)
gcc -o executavel cadastra.o

Quando você tiver outros códigos .h + .c, basta repetir o primeiro gcc acima para cada .c e, no último gcc, coloque todos os .o no final, separados por espaços. Por exemplo:
gcc -o abc -c abc.c
gcc -o xyz -c xyz.c
gcc -o hij -c hij.c
gcc -o executavel abc.o xyz.o hij.o

Esse é o padrão, e permite que, quando você alterar algum código, tenha que recompilar só o que alterou, e não o projeto todo.

Seguindo esses passos, seu problema será resolvido e evitará muuuuito erros futuros (além de deixar o seu código mais padronizado).

E nunca se esqueca o #ifndef no comeco do código, como coloquei no exemplo acima. Isso impede que um código seja importado (com #include) mais de uma vez, gerando erros. Por exemplo, se você incluir o mysql.h em mais de um lugar, pode dar conflito. Com ifndef, ele verifica se já foi includo. Se sim, não inclui novamente. Dessa forma, inclua mysql.h em todo o código que usa ele sem medo, pois o próprio compilador cuida desse controle para você.

Espero ter ajudado e, caso essa solução não funcione, poste os resultados aqui que faço questão de ajudar-lhe.

PS: Não estou criticando seu conhecimento em programação, apenas lhe dando dicas de como deixar seu código mais padrão.


4. Re: Dúvida com erro em código [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 29/10/2010 - 21:37h

tentou compilar com o g++? não sei se tem mysql.h para C. desculpe se falei besteira.


5. Re: Dúvida com erro em código [RESOLVIDO]

André
andrezc

(usa Debian)

Enviado em 29/10/2010 - 21:51h

Entendi. Obrigado pelas dicas.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts