Página 1 de 1

Usar código C em C++

MensagemEnviado: 09 Jan 2009 06:50
por joao
Ola Pessoal,

Estou com um probleminha que eu acho que seja simples, mas está me dando uma dor de cabeça lazarenta.

Eu quero usar o MySQL no meu programa. Apenas o client.

O problema é que o client do MySQL é inteiro em C e o meu código em C++.
Então, na hora de compilar, tudo roda maravilha, mas na hora de linkar, ele reclama que nao acha as bibliotecas.

Até onde eu me lembro, o problema é que o C++ gera nomes diferentes do C por que ele suporta herança e sobrecarga de operadores e etc...

Então, a função/método:
int test()

compilado em C fica assim:
test

Mas em C++ ele fica assim:
test@4

O que eu quero confirmar é que se eu colocar que é uma função C:
extern "C" int test()

Já resolveria o meu caso, pois só irei chamar as funções em C e em nenhum momento irei chamar métodos C++ neste código em C. (Neste caso precisaria de wrapper né?)


Para terminar, se a minha conclusão está correta(Não deu tempo de testar ainda infelizmente), então porque existe um wrapper do MySQL para C++ chamado MySQL++? Algum motivo em específico para eu usar este wrapper?


Obrigado,
Joao

MensagemEnviado: 09 Jan 2009 07:53
por ivan
Existe uma opção de compilação que resolve o seu prob. E claro, não sei de cabeça... tem q pesquisar no help do seu compilador.

MensagemEnviado: 09 Jan 2009 09:37
por msamsoniuk
do proprio site deles:

MySQL++ is a C++ wrapper for MySQL’s C API. It is built around the same principles as the Standard C++ Library, to make dealing with the database as easy as dealing with STL containers. In addition, MySQL++ provides facilities that let you avoid the most repetitive sorts of SQL within your own code, providing native C++ interfaces for these common tasks.

me parece obvio... se vc usa determinada linguagem, vc precisa de um cliente nativo para determinada linguagem, do contrario nao vai suportar as funcionalidades nativas desta determinada linguagem.

por outro lado, tambem eh obvio que nenhuma linguagem vai ter todo o suporte da linguagem C, motivo pelo qual existe a facilidade de usar bibliotecas em C a partir de qq determinada linguagem, perdendo eh claro as facilidades nativas destas determinadas linguagens.

portanto, se existe um wrapper para sua determinada linguagem, use-o e use as facilidades da sua determinada linguagem... dando uma olhada rapida na documentacao vc descobre que o mysql++ possui classes para conexao e queries.

afinal, se vc nao usa os recursos de c++, entao pq nao faz em c diretamente ? :)

MensagemEnviado: 09 Jan 2009 10:10
por joao
Eu continou não entendendo...

Ele é um Wrapper, mas um wrapper para qual funcionalidade se até onde eu vi eu apenas chamo as funções em C do MySQL e nunca acontece o contrário. Eu sempre usei wrapper para fazer exatamente chamada de métodos C++ em código C.

Qual seria o problema em eu usar o EXTERNAL "C" neste caso?

Outra coisa que esqueci de comentar é que já tenho tudo funcionando no meu código. Ou seja, todo o tratamento já está sendo feito, usando o wxWidgets(Connect, query, result e etc). O único problema é que eu usava libraries do Dev-Cpp para compilar e agora não uso mais, pois estou usando diretamente o gcc em linha de comando. Dai que começou a dar este problema.
Resumindo:
Tinha Dev-cpp com mysql baixado pelo Dev-cpp e rodava.
Desinstalei ele e instalei apenas o gcc e outras bibliotecas do projeto.
Ele compila e dá o erro explicado acima.

Por usar o wxWidgets que é em C++ eu preciso fazer isso e não estou trabalhando em apenas C.

[]'s

MensagemEnviado: 09 Jan 2009 10:44
por Jorge_Francisco
João,

Eu uso MySQL no C++ Builder, mas uso uma DLL, que biblioteca e qual código em C refere-se? Desconheço mesmo.

Abraço

MensagemEnviado: 09 Jan 2009 11:18
por joao
Ola Jorge!

Então quem sabe vc tenha a solução que eu quero! :)

Então, simplesmente falando, quero usar Mysql no meu programa que é em C++(No caso com gcc/g++ e wxwidgets).

Como fiz isso?
1 - baixei o gcc 3.4.5 com wxwidgets2.8(Isso aqui é apenas um monte de código em C++ que faz as janelas do meu prog, então nem esquente com isso.)

2 - Baixei o mySQL server direto da pagina deles.

3 - Usei os headers(.h) do MySQL server para compilar o meu código. que tinha um include deste(usei o g++):
#include "mysql.h"

4 - linkei, usando o g++, passando esses dados:
g++ -L"c:\mysql\lib\opt" -lmysql ...
* - Desculpe, não sei exatamente a linha pq foi no comp de casa, mas acho que usei isto.

5 - Recebi erros de que não achou as funções do mysql, como por exemplo:
undefined link error - mysql_connect@4
* - Novamente, desculpe mas não consigo me lembrar exatamente do error aqui.

6 - tentei incluir outra coisa ao inves do -lmysql: -lmysqlclient
Tive os mesmos erros novamente.

É isso.

Qualquer ajuda é bem vinda!

[]'s

MensagemEnviado: 09 Jan 2009 12:35
por msamsoniuk
joao escreveu:Eu continou não entendendo...

Ele é um Wrapper, mas um wrapper para qual funcionalidade se até onde eu vi eu apenas chamo as funções em C do MySQL e nunca acontece o contrário. Eu sempre usei wrapper para fazer exatamente chamada de métodos C++ em código C.


uai ? um wrapper em C++ supostamente adiciona suporte a classes e orientacao a objetos... no lugar de vc fazer:

FooDescriptor_t *foo = bar(); /* chama construtor em c */
crash(foo);

vc faria:

FooDescriptor_o foo; // chama construtor intrinsico em c++
foo.crash();

Qual seria o problema em eu usar o EXTERNAL "C" neste caso?


nao tem problemas, mas obviamente perde as supostas "vantagem" de c++... e na hora de colocar o header, obviamente vc fez:

Código: Selecionar todos
extern "C" {
#include <mysql.h>
}


nao eh? eu acho que a mysql.h jah possui um ifdef para isso, eh bom dar uma verificada... se ela jah possui, vc nao pode fazer o include dentro do extern "C", mas se ela nao possui, vc deve fazer...

por sinal, olha que beleza:

http://social.msdn.microsoft.com/Forums ... 52d46a201/

por isso, ao contrario do proex, eu agradeco a deus todos os dias por nao precisar desenvolver para windows! obrigado deus! :)

MensagemEnviado: 09 Jan 2009 12:59
por joao
Bom, juntando todas as dicas, tenho várias coisas a explicar e a perguntar! :)

Ambiente de trabalho: Não estou usando Visual C++, nem Dev-Cpp. Apenas MinGW na versão 3.4.5 e Mysql server, que vem com .h e .libs. Tentei também usar com .dll, mas também não adiantou.

Perguntas e descobertas:

1 - O arquivo mysql.h só inclui o extern "C" caso eu tenha definido __cplusplus. Sabe me dizer se isso já está automaticamente acontecendo caso eu use o g++ para compilar e linkar? Ou preciso adicionar esse define na compilação? (PS: Eu não estou usando o extern e está dando erro.)

2 - Caso seja automatico isso, porque diabos o g++ está entendendo que a lib do MySQL está em C++? Não consigo ver motivos para ele colocar @4 no nome da função.

3 - Não preciso do wrapper no meu caso. Concordo que seria melhor no caso de usar as "funcionalidades" do C++, mas neste meu codigo eu estou fazendo o wrapper indiretamente, então não tem motivos para usa-lo. O único motivo que possa ser e que só agora me lembrei, é que eu estou usando uma estrutura do C para ler o resultado. Vc acha que isso pode ter algum problema? Acho que não... O motivo principal para não usar o wrapper é que o código já estava funcionando e eu teria que ficar acompanhando dois códigos para futuras atualizações. Não acho necessário no meu caso.

4 - O erro do link que vc passou é o erro que estou tendo. Mas no MinGW. Aparentemente, parece que o MinGW não aceita .lib, apenas .a para o link. Neste caso, achei dicas de como transformar o arquivo .lib para .a:
http://dev.mysql.com/doc/refman/5.0/en/ ... iling.html

Fica ai a dica. Vou testar de noite e posto resultado dai.

Obrigado,
Joao

MensagemEnviado: 10 Jan 2009 21:51
por ivan

MensagemEnviado: 12 Jan 2009 05:52
por joao
Depois de vários testes, o problema do mysql foi resolvido!

O que acontece é que o mingw aceita apenas libraries do tipo .a e não dll. Na verdade, existe alguma maneira de usar dll, mas não descobri ainda. Como quero deixar o código entre linux e windows o mais similar possível, eu estou tentando não usar dll e por isso nem pesquisei.

Valeu a todos pelas dicas e fica aqui como consulta para quem precisar algum dia.

[]'s