Fórum Ubuntu Linux - PT

Suporte Técnico => Programação e Scripts => Tópico iniciado por: Gibbs em 24 de Abril de 2013, 11:00

Título: Programacao C++ no ubuntu
Enviado por: Gibbs em 24 de Abril de 2013, 11:00

Boas para todos.

Estou testando um programa no codeblocks 10.05 no  ubuntu 12.04 em c++ com acesso ao mysql.
Já tenho instalado tudo, criei uma tabela no mysql, e quando tento compilar o programa dá erro na 2ª linha ( veja abaixo ).
Erro: /home/usuario/Programas C-C++/Linux/C++/AcessoDB/main.cpp:2:52: fatal error: mysql-conn/mysql.h: No such file or directory
Pergunta: onde encontro a biblioteca mysql.h e onde coloco ela ?

Grato a todos.
Gibbs.

#include  <istream>// Para usar o cin.get
#include  "mysql/mysql.h"  // biblioteca mysql
#include  <istringstream> // para usar o istringstream

???
Título: Re: Programacao C++ no ubuntu
Enviado por: irtigor em 24 de Abril de 2013, 12:33
No Debian e derivados, os headers e etc (arq. necessários somente pra desenvolvimentos), são empacotados separadamente, e possuem o sufixo "-dev", no seu caso: "libmysqlclient-dev".
Título: Re: Programacao C++ no ubuntu
Enviado por: Gibbs em 24 de Abril de 2013, 12:47
No Debian e derivados, os headers e etc (arq. necessários somente pra desenvolvimentos), são empacotados separadamente, e possuem o sufixo "-dev", no seu caso: "libmysqlclient-dev".

Quer isto dizer que tenho que intalar o pactote "libmysqlclient-dev". ?

Já instalei, e agora diz que não encontra as bibliotecas.

Falta indicar o caminho das bibliotecas ? onde elas estão ?

Gibbs
Título: Re: Programacao C++ no ubuntu
Enviado por: irtigor em 24 de Abril de 2013, 13:44
Você poderia ter checado o conteúdo do pacote, de qualquer forma, o header está em "/usr/include", como todos os demais do sistema. Nesse pacote também está presente um utilitário que facilita a ligação, mysql_config, dê uma olhada.

Outra coisa, como não é local, prefira <mysql/mysql.h>.
Título: Re: Programacao C++ no ubuntu
Enviado por: Darcamo em 24 de Abril de 2013, 22:29
Para usar uma biblioteca no seu programa, seja mysql ou outra qualquer, você precisa de duas coisas: dos cabeçalhos que correspondem aos arquivos ".h" e da biblioteca propriamente dita (normalmente um arquivo ".so", que são as bibliotecas para linkagem dinâmica, mas tem também os arquivos ".a" que são bibliotecas para linkagem estática).

Quando você instala no ubuntu algum programa que foi feito usando mysql então a biblioteca será instalada automaticamente, caso já não esteja, como dependência desse programa. Só que os arquivos de cabeçalho não são instalados porque eles só são úteis para quem vai programar usando a biblioteca e não para quem quer apenas usar um programa que foi feito com essa biblioteca.

Como no seu caso você quer é programar então tem que instalar os cabeçalhos e isso é feito normalmente instalando um pacote da biblioteca cujo nome termina com "-dev". Uma vez que você tenha instalado o pacote "-dev" certo você não obterá mais o erro de arquivo .h não encontrado quando tentar compilar seu programa.

No entanto, você provavelmente obterá erros de referência indefinida para funções que você usou nessa biblioteca. Isso acontece porque o gcc não vai linkar seu programa automaticamente com uma biblioteca. Você precisa indicar isso na hora da compilação.
O comando para compilar provavelmente seria similar a
Código: [Selecionar]
g++ seuprograma.cpp -lNOMEonde NOME é o nome da biblioteca. Note que tem um "-" e um "L" minúsculo antes do NOME.

As bibliotecas ficam normalmente na pasta /usr/lib e possuem nomes na forma "libNOME.so" ou "libNOME.a". Quando você usa  parâmetro "-lNOME" o g++ inclui "lib" no começo e a extensão no fim para encontrar o arquivo. Você também poderia compilar com
Código: [Selecionar]
g++ seuprograma.cpp /usr/lib/libNOME.so
Título: Re: Programacao C++ no ubuntu
Enviado por: Gibbs em 26 de Abril de 2013, 07:20
Para usar uma biblioteca no seu programa, seja mysql ou outra qualquer, você precisa de duas coisas: dos cabeçalhos que correspondem aos arquivos ".h" e da biblioteca propriamente dita (normalmente um arquivo ".so", que são as bibliotecas para linkagem dinâmica, mas tem também os arquivos ".a" que são bibliotecas para linkagem estática).

Quando você instala no ubuntu algum programa que foi feito usando mysql então a biblioteca será instalada automaticamente, caso já não esteja, como dependência desse programa. Só que os arquivos de cabeçalho não são instalados porque eles só são úteis para quem vai programar usando a biblioteca e não para quem quer apenas usar um programa que foi feito com essa biblioteca.

Como no seu caso você quer é programar então tem que instalar os cabeçalhos e isso é feito normalmente instalando um pacote da biblioteca cujo nome termina com "-dev". Uma vez que você tenha instalado o pacote "-dev" certo você não obterá mais o erro de arquivo .h não encontrado quando tentar compilar seu programa.

No entanto, você provavelmente obterá erros de referência indefinida para funções que você usou nessa biblioteca. Isso acontece porque o gcc não vai linkar seu programa automaticamente com uma biblioteca. Você precisa indicar isso na hora da compilação.
O comando para compilar provavelmente seria similar a
Código: [Selecionar]
g++ seuprograma.cpp -lNOMEonde NOME é o nome da biblioteca. Note que tem um "-" e um "L" minúsculo antes do NOME.

As bibliotecas ficam normalmente na pasta /usr/lib e possuem nomes na forma "libNOME.so" ou "libNOME.a". Quando você usa  parâmetro "-lNOME" o g++ inclui "lib" no começo e a extensão no fim para encontrar o arquivo. Você também poderia compilar com
Código: [Selecionar]
g++ seuprograma.cpp /usr/lib/libNOME.so

Grato pela explicação, muito bom para "inicio". Pois programar neste S.O. tem a particularidade do próprio sistema.
Mas vou estudar o que disse e tentar por a correr.

Valeu.
Gibbs.
Título: Re: Programacao C++ no ubuntu
Enviado por: irtigor em 26 de Abril de 2013, 08:41
São conceitos da linguagem, que uma vez bem dominados, tornam irrelevante as "peculiaridades" do sistema (que nesse caso, é basicamente a separação do header).
Título: Re: Programacao C++ no ubuntu
Enviado por: Gibbs em 26 de Abril de 2013, 12:25
Você poderia ter checado o conteúdo do pacote, de qualquer forma, o header está em "/usr/include", como todos os demais do sistema. Nesse pacote também está presente um utilitário que facilita a ligação, mysql_config, dê uma olhada.

Outra coisa, como não é local, prefira <mysql/mysql.h>.

Desculpe a pergunta de iniciante, mas o utilitário que diz é o "libmysqlclient-dev" ?
eu instalei via comando, mas este utilitário mysql_config onde ele fica localizado depois da instalação ?
Fiz uma procura e não encontrei.

Grato.
gibs.
Título: Re: Programacao C++ no ubuntu
Enviado por: irtigor em 26 de Abril de 2013, 13:55
É um utilitário de linha de comando, abra o terminal e digite "mysql_config", sem aspas.
Título: Re: Programacao C++ no ubuntu
Enviado por: Darcamo em 29 de Abril de 2013, 19:59
Nunca programei com SQL então dei o libmysqlclient-dev como exemplo para explicar o "-dev" no nome. Tente instalar o pacote "libmysql++-dev" que acredito ser o que você realmente precisa. Após instalado, você terá o programa mysql_config indicado pelo irtigor e pode rodar esse programa no terminal.

Algumas bibliotecas fornecem um programa normalmente chamado nomeDaBiblioteca_config, que é o caso da SQL, cuja única função é lhe informar os parâmetros que você deve usar para compilar um programa com essa biblioteca. Isso facilita muito as coisas. Por exemplo, instalei o pacote libmysql++-dev e abaixo segue o resultado. No terminal digitei
Código: [Selecionar]
mysql_config --cflags --libse obtive a seguinte informação
-L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -lrt -ldl

Supondo que estou criando um programa que usa a SQL e tenho 3 arquivos chamados main.cpp, file1.h, file1.cpp e quero compilar meu programa. Para isso basta eu usar o comando abaixo
Código: [Selecionar]
g++ main.cpp, file1.h, file1.cpp -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -lrt -ldl
Não lembro se o nomes dos meus arquivos vem antes ou depois das opções de compilação, mas acho que não faz diferença.

Note que na hora rodar o comando mysql_config eu passei duas opções, "--cflags" e "--libs". O primeiro pede para o mysql_config informar opções que o g++ vai usar na hora da compilação, enquanto que o segundo pede informações que serão usadas na hora da linkagem. Coloquei tudo em um comando só para facilitar, mas é útil saber a diferença porque se você for usar uma IDE depois normalmente as IDEs tem os lugares certos para colocar essas informações.

Uma outra dica para facilitar, eu também poderia compilar esse meu exemplo com o comando
Código: [Selecionar]
g++ main.cpp, file1.h, file1.cpp `mysql_config --cflags --libs`Ao colocar o comando mysql_config dentro de sinais de crase o shell do linux vai substituir tudo pelo resultado resultando assim no comando completo de compilação.

PS: Para facilitar a compilação você pode criar um Makefile. Aqui tem um tutorial que criei a um bom tempo
http://ubuntuforum-pt.org/index.php/topic,21155.0.html (http://ubuntuforum-pt.org/index.php/topic,21155.0.html)

Outra opção, claro, é usar uma IDE, mas aprender a fazer as coisas apenas com um editor de texto e o terminal é bem educativo.
Título: Re: Programacao C++ no ubuntu
Enviado por: Gibbs em 02 de Maio de 2013, 13:13

Alô Darcamo, vou ver o que voce disse, q.q. dúvida posto aqui.
grato.
Título: Re: Programacao C++ no ubuntu
Enviado por: Gibbs em 02 de Maio de 2013, 13:28

Está dando o seguinte erro
ligabd.cpp:3:55: fatal erros: istringstream: NO such file or  directory
compilation teminated.

No seguimento da dúvida logo de início, qual o motivo dela não encontrar está bilioteca ?
Estou usando o código abaixo ( peguei na net para testar )

#include  <istream> // Para usar o cin.get
#include  "mysql/mysql.h"  // biblioteca mysql
#include  <istringstream> // para usar o istringstream

using namespace std;

int main(void)
{
 MYSQL DBCon; // Vairiavel de conexão
 MYSQL_RES *result; //variável que recebe o resultado
 MYSQL_ROW dados; //variável que recebe os dados

 int ID; // Converter para integer

 // Inicia a variável DBCon
 mysql_init(&DBCon);

 //Conecta com o banco de dados
 if ( mysql_real_connect(&DBCon, "127.0.0.1", "root", "senha", "acessodb", 0, NULL, 0) )
 {
       printf("Conectado!\n\n");
  }
  else
  {
       //Escreve o erro que ocorreu
       printf("Erro n %d : %s\n", mysql_errno(&DBCon), mysql_error(&DBCon));
   cin.get();  //Espera o usuário pressionar uma tecla
   cin.get();
   return 1;
  }

// Executa a consulta
if(mysql_query(&DBCon,"select * from usuarios"))
{
printf("Erro n %d : %s\n",mysql_errno(&DBCon),mysql_error(&DBCon));
cin.get();
cin.get();
return 1;
}

// Recebe os dados da cunsulta
result = mysql_store_result(&DBCon);

// Se consultou (sem erros)
if (result)
{
// Enquanto receber dados vai escrevendo
while ((dados=mysql_fetch_row(result)) != NULL)
{
 // Escreve os dados formatados sende estes a ID e o NOME

 istringstream buffer(dados[0]); // Cria a variável que recebera a string a ser convertida para int
 buffer >> ID; // Convert a string para int
 printf("%02d     %s\n",ID,dados[1]); // Escreve formatado
}

// Limpa da memória
mysql_free_result(result);

}
else
{
printf("Erro n %d : %s\n", mysql_errno(&DBCon), mysql_error(&DBCon));
cin.get();
cin.get();
return 1;
}
printf("\n");
// Fecha a conexão ...
mysql_close(&DBCon);

return 0;
}
Título: Re: Programacao C++ no ubuntu
Enviado por: Darcamo em 02 de Maio de 2013, 20:13
O include correto para usar o istringstream é
Código: [Selecionar]
#include <sstream>

Precisei incluir também
Código: [Selecionar]
#include <cstdio> // Necessário porque vc está usando o printf
#include <iostream> // Necessário porque você está usando o cin

Com isso consegui compilar seu programa com o comando abaixo
g++ test.cpp `mysql_config --cflags --libs`
onde test.cpp é o nome que salvei o arquivo.
Título: Re: Programacao C++ no ubuntu
Enviado por: Gibbs em 03 de Maio de 2013, 07:47
O include correto para usar o istringstream é
Código: [Selecionar]
#include <sstream>

Precisei incluir também
Código: [Selecionar]
#include <cstdio> // Necessário porque vc está usando o printf
#include <iostream> // Necessário porque você está usando o cin

Com isso consegui compilar seu programa com o comando abaixo
g++ test.cpp `mysql_config --cflags --libs`
onde test.cpp é o nome que salvei o arquivo.

OK,  também consegui. Funcionou.
Obrigado pela ajuda.
Está dando para pegar alguma experiência.
Em sua opinião ( e quem quiser dar a sua ), qual IDE melhor para compilar criar executável em c/c++ no ubuntu ?

Grato.





Título: Re: Programacao C++ no ubuntu
Enviado por: Darcamo em 03 de Maio de 2013, 18:15
IDEs tem várias e já houveram muitos tópicos aqui perguntando sobre isso. Basta dar uma pesquisada aqui no fórum sobre IDE.
Algumas das comumente citadas são: Eclipse, anjuta, kdevelop, geany, code::blocks, qt creator, etc.

Ainda prefiro usar um bom editor de texto ao invés de uma IDE e compilar usando um Makefile genérico que criei faz muito tempo (na época que escrevi esse tutorial que mencionei antes). Acho mais leve, rápido, confiável e na minha opinião nada substitui o Emacs para escrever qualquer tipo de texto, seja programação ou não (até leio e escrevo e-mails no Emacs e você pediu uma opinião  :P ).

Tente alguma dessas IDEs que citei que são bem conhecidas e você deve gostar de alguma. Eu começaria pelo Eclipse e embora ele seja um pouquinho complicado no começo, acredito que não deixe nada a desejar em relação a nenhuma outra (acredito que seja bastante usado comercialmente também). Se o Eclipse ficar pesado no seu computador, tente então o code:blocks ou o geany que são bem leves.
Título: Re: Programacao C++ no ubuntu
Enviado por: Gibbs em 07 de Maio de 2013, 10:49
IDEs tem várias e já houveram muitos tópicos aqui perguntando sobre isso. Basta dar uma pesquisada aqui no fórum sobre IDE.
Algumas das comumente citadas são: Eclipse, anjuta, kdevelop, geany, code::blocks, qt creator, etc.

Ainda prefiro usar um bom editor de texto ao invés de uma IDE e compilar usando um Makefile genérico que criei faz muito tempo (na época que escrevi esse tutorial que mencionei antes). Acho mais leve, rápido, confiável e na minha opinião nada substitui o Emacs para escrever qualquer tipo de texto, seja programação ou não (até leio e escrevo e-mails no Emacs e você pediu uma opinião  :P ).

Tente alguma dessas IDEs que citei que são bem conhecidas e você deve gostar de alguma. Eu começaria pelo Eclipse e embora ele seja um pouquinho complicado no começo, acredito que não deixe nada a desejar em relação a nenhuma outra (acredito que seja bastante usado comercialmente também). Se o Eclipse ficar pesado no seu computador, tente então o code:blocks ou o geany que são bem leves.

Valeu. perguntei isto porque uso o code::blocks e as vezes o geany. Mas quando queremos compilar com ligação ao mysql, por exemplo, fica mais difícil.
Queria investir no aprendizagem de uma delas, o mais difícil é mesmo é configurar para uma boa compilação.

Um outra questáo é: é viável estas iDE para usar em ambientes windows ?

Grato.
Gibbs
Título: Re: Programacao C++ no ubuntu
Enviado por: Darcamo em 10 de Maio de 2013, 11:34
Nunca programei com nenhuma delas no windows (praticamente não não programei no windows) para dizer isso. Acredito que sim.

Uma das coisas mais complicadas de se fazer em uma IDE quando não se sabe é justamente como configurar para usar alguma biblioteca externa. Isso varia um pouco de IDE para IDE e nem sempre é claro. Pode variar também se essa biblioteca foi instalada pelo gerenciador de pacotes do sistema, ou se você mesmo compilou, etc.

Normalmente essas configurações envolvem criar um projeto nessa IDE para o seu programa e setar essas opções de compilação e linkagem no projeto. Frequentemente há partes separadas nas configurações do projeto para as opções de compilação e linkagem e as de linkagem costumam ser as mais importantes.
Como eu não uso nenhuma dessas IDEs não posso dizer como fazer isso nelas a menos que eu mesmo instale uma delas para testar. Posso fazer isso depois caso você tenha dificuldades.