Programacao C++ no ubuntu

Iniciado por Gibbs, 24 de Abril de 2013, 11:00

tópico anterior - próximo tópico

Gibbs


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

???

irtigor

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".

Gibbs

Citação de: irtigor online 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".

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

irtigor

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>.

Darcamo

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
g++ seuprograma.cpp -lNOME
onde 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
g++ seuprograma.cpp /usr/lib/libNOME.so

Gibbs

Citação de: Darcamo online 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
g++ seuprograma.cpp -lNOME
onde 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
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.

irtigor

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).

Gibbs

Citação de: irtigor online 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>.

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.

irtigor

É um utilitário de linha de comando, abra o terminal e digite "mysql_config", sem aspas.

Darcamo

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
mysql_config --cflags --libs
e 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
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
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

Outra opção, claro, é usar uma IDE, mas aprender a fazer as coisas apenas com um editor de texto e o terminal é bem educativo.

Gibbs


Alô Darcamo, vou ver o que voce disse, q.q. dúvida posto aqui.
grato.

Gibbs


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

Darcamo

O include correto para usar o istringstream é

#include <sstream>


Precisei incluir também

#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.

Gibbs

Citação de: Darcamo online 02 de Maio de 2013, 20:13
O include correto para usar o istringstream é

#include <sstream>


Precisei incluir também

#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.






Darcamo

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.