Problemas na compilação de código c++ no netbeans 6.5

23 respostas
L

Bom dia a todos,

Estou tentando instalar o c++ no netbeans 6.5 e para isso estou usando o cygwin.
Ele instala corretamente, e no netbeans eu consigo apontar as configuração de compilador e tudo mais. Porém quando ele pede o arquivo make eu não consigo selecionar um que não de erro.
O erro que recebo quando tento compilar o projeto é:

Executando "E:\Projetos\PROJETOS CPP\PrototipoCPP\Makefile  -f Makefile CONF=Debug clean" em E:\Projetos\PROJETOS CPP\PrototipoCPP


Limpar falhou. Sair do valor -1.

Estou precisando usar o netbeans por que não quero perder tempo aprendendo a utilizar outra ide, nesse caso quero apenas estudar a linguagem, inclusive eu preciso apenas acessar portas seriais de forma nativa para saber se a performance é superior ao de outras linguagens como visual basic ou delphi.

Gostaria de saber se quando eu instalo o cygwin além dele eu preciso instalar o make separado, pois eu baixei o make 3.82 da pagina dele e não deu do mesmo jeito.
A versão do cygwin que estou usando é a 1.5.5.

Desde já agradeço a antenção e aguardo o retorno :slight_smile:

23 Respostas

L

kra usa o CodeBlocks, pq no netbeans dá muito trabalho msm configurá-lo…no CodeBlocks já vem td pronto!

V

Concordo com o luxu.

Se você vai fazer uma aplicação Windows, use o Visual C++ Express:
http://www.microsoft.com/express/Windows/

É, de longe, a melhor IDE de C++ hoje em dia. Ótimo depurador, ótimo code completion, excelente suporte a macros e condicionais, excelente implementação da STL (inclusive uma versão em modo debug).

Se for multiplataforma, use o Code::Blocks:
http://www.codeblocks.org/

Você não tenta martelar um prego na parede com uma chave de fenda, só porque quer se concentrar apenas em bater no prego, e não aprender a usar um martelo!

Y

laudenpower:
Bom dia a todos,

Estou tentando instalar o c++ no netbeans 6.5 e para isso estou usando o cygwin.
Ele instala corretamente, e no netbeans eu consigo apontar as configuração de compilador e tudo mais. Porém quando ele pede o arquivo make eu não consigo selecionar um que não de erro.
O erro que recebo quando tento compilar o projeto é:

Executando "E:\Projetos\PROJETOS CPP\PrototipoCPP\Makefile  -f Makefile CONF=Debug clean" em E:\Projetos\PROJETOS CPP\PrototipoCPP


Limpar falhou. Sair do valor -1.

Estou precisando usar o netbeans por que não quero perder tempo aprendendo a utilizar outra ide, nesse caso quero apenas estudar a linguagem, inclusive eu preciso apenas acessar portas seriais de forma nativa para saber se a performance é superior ao de outras linguagens como visual basic ou delphi.

Gostaria de saber se quando eu instalo o cygwin além dele eu preciso instalar o make separado, pois eu baixei o make 3.82 da pagina dele e não deu do mesmo jeito.
A versão do cygwin que estou usando é a 1.5.5.

Desde já agradeço a antenção e aguardo o retorno :slight_smile:

No site do netbeans tem um tutorial de como instalar e configurar o C++ nele, em windows, linux etc…
falow

V

A diferença deve ser pequena.
Essas duas linguagens também usam métodos nativos diretamente para fazer o acesso à porta serial.

A vantagem do C vai ser no processamento depois que o dado chega ou sai da serial. De qualquer forma, se você precisa acessar as portas de maneira intensa e com muito controle, é melhor faze-lo usando a API diretamente (java é uma péssima opção).

L

A diferença que preciso é de 30ms em um baudrate de 57600 8 databit 1 stop bit e paridade none.

Será que consigo isso?

O tamanho médio do pacote de dados é de 73 caracteres.

Confesso que só estou tentando c++ por que já tentei em delphi, vb e java e não consegui em nenhuma delas!

V

Bom, você consegue enviar 57600 simbolos por segundo.

Como vc tem 73 caracteres, você poderá enviar 789 mensagens por segundo.
Isso dá pouco mais de uma mensagem por milisegundo.

Só cuidado, a porta serial é um meio pouco confiável. Que tipo de problemas você está tendo?

L

Bom, vou desfiar meu rosário… :slight_smile:
Tenho um servidor feito em vb que realiza uma consulta via serial rs485 para 5 dispositivos diferentes e com seus respectivos endereços.
Acontece que o meu objetivo é “tomar” o lugar de um desses 5 dispositivos, e para isso eu preciso emular o protocolo de comunicação dele.
A parte de emular o protocolo já foi realizada, porém o servidor realiza uma consulta de status dos dispositivos em um intervalo de 30ms entre um dispositivo e outro, e a consulta de status consiste em um pacote de 12 caracteres, onde está contido o endereço do dispositivo (para que o mesmo responda na sua vez).
Essa consulta é realizada em todos os dispositivos pelo servidor e quando acontece algo a algum dispositivo, esse deve responder assim que recebe o pacote de consulta contendo o seu endereço.
Então o dispositivo possui 30ms para realizar o envio do comando que indica a ocorrencia do evento nele (como o pressionamento de uma botoeira, por exemplo).
Nesse caso se o dispositivo demora mais de 30ms para devolver o comando referente ao evento ocorrido, o servidor acaba recebendo esse comando durante a consulta de outro dispositivo, invalidando assim o envio do dispositivo e quebrando o protocolo.

Resumindo: Preciso enviar um comando para o servidor numa faixa máxima de 30ms depois de receber o comando de consulta com o endereço do dispositivo emulado, pois se isso não acontecer o servidor passa a consultar o proximo dispositivo e o comando enviado é invalidado pelo servidor.

Tentei fazer isso em: Java, VB e delphi6 falhei miseravelmente em todos eles.

V

E você já verificou se a lentidão é mesmo da serial? Ou da sua própria aplicação?

L

Tipo pelo que já foi verificado tudo indica ser a porta, pois o código foi extensamente revisado e tudo que poderia indicar perda de performance (como loops de verificação de caracter entre outras coisas) foi retirado. Tipo a estratégia de leitura da porta serial é a de pooling ou seja a porta é verificada constantemente para verificar se chegou dados (isso é realizado sem nenhum tipo de sleep).

V

Complicado. Por essas e outras sempre preferi lidar com serial usando a API direto.
Comunicação “confiável” via serial é sempre uma dor de cabeça.

L

Nem me fale esse projeto é de longe o mais porre que já tive.

Tipo em delphi enxugamos tudo e mais um pouco, fizemos todas as verificações da mensagem (como o endereço a qual ela se destina por exemplo) direto pelo indice da String, utilizamos inclusive uma dll chamada inpout32.dll que manipula direto os pinos da porta e nada adiantou.
Nesse caso tens um exemplo de como utilizar porta serial usando c++ e como se configura o code blocks? No caso do code blocks, ele ta dando um erro que não deixa salvar o projeto.

Agradeço a atenção.

J

Dá uma olhada aqui

http://qextserialport.sourceforge.net/

Usa o qt, vc não vai ter problemas com ele.
http://qt.nokia.com/products/

L

Nesse caso em termos de performance ele se encaixa na situação que relatei ao vinny?
O code blocks funcionou corretamente, tava dando erro por que eu não apontei a pasta do projeto. Agora to lendo sobre c/c++ nesse caso pude observar que a sintaxe é muito próxima do java (o que prova que java “chupinhou” a sintax dos caras :slight_smile: )

V

Sim, o java é intencionalmente parecido com o C++. Foi cópia mesmo, a Sun inicialmente até divulgava isso como uma vantagem.

Porém, tome cuidado. É zilhões de vezes mais difícil programar em C++ do que em Java. E você tem que ficar atento as boas práticas da linguagem, ou fatidicamente irá:

  1. Inicializar objetos desnecessariamente;
  2. Fazer cópias desnecessárias de dados;
  3. Recair em memory leaks e buffers underuns;
J

laudenpower:
Nesse caso em termos de performance ele se encaixa na situação que relatei ao vinny?
O code blocks funcionou corretamente, tava dando erro por que eu não apontei a pasta do projeto. Agora to lendo sobre c/c++ nesse caso pude observar que a sintaxe é muito próxima do java (o que prova que java “chupinhou” a sintax dos caras :slight_smile: )

Se encaixa sim. Se você quiser usar o codeblocks também não tem problema, porque é um ide muito bom também. Eu prefiro o qtcreator por causa da ide muito parecida com o delphi para criar interfaces gráficas, e também do framework ser MVC. Mas no final existem várias opções.

J

O netbeans c++ precisa do shell dos unix para funcionar corretamente. Para usar em plataforma win32 ou win64 você precisa do Cygnus ou do MSys. Para win não compensa não, é preferível usar mingw com codeblocks ou qtcreator.

J

laudenpower:
Bom, vou desfiar meu rosário… :slight_smile:
Tenho um servidor feito em vb que realiza uma consulta via serial rs485 para 5 dispositivos diferentes e com seus respectivos endereços.
Acontece que o meu objetivo é “tomar” o lugar de um desses 5 dispositivos, e para isso eu preciso emular o protocolo de comunicação dele.
A parte de emular o protocolo já foi realizada, porém o servidor realiza uma consulta de status dos dispositivos em um intervalo de 30ms entre um dispositivo e outro, e a consulta de status consiste em um pacote de 12 caracteres, onde está contido o endereço do dispositivo (para que o mesmo responda na sua vez).
Essa consulta é realizada em todos os dispositivos pelo servidor e quando acontece algo a algum dispositivo, esse deve responder assim que recebe o pacote de consulta contendo o seu endereço.
Então o dispositivo possui 30ms para realizar o envio do comando que indica a ocorrencia do evento nele (como o pressionamento de uma botoeira, por exemplo).
Nesse caso se o dispositivo demora mais de 30ms para devolver o comando referente ao evento ocorrido, o servidor acaba recebendo esse comando durante a consulta de outro dispositivo, invalidando assim o envio do dispositivo e quebrando o protocolo.

Resumindo: Preciso enviar um comando para o servidor numa faixa máxima de 30ms depois de receber o comando de consulta com o endereço do dispositivo emulado, pois se isso não acontecer o servidor passa a consultar o proximo dispositivo e o comando enviado é invalidado pelo servidor.

Tentei fazer isso em: Java, VB e delphi6 falhei miseravelmente em todos eles.

Posso estar errado, mas não creio que o c++ vá resolver a sua situação. Todas essas opções que você usou(java, delphi, vb) usam a mesma api do windows internamente.

T

Se seu dispositivo requer que a resposta seja enviada em no máximo 30 ms, eu diria que é necessário deixar só essa parte que recebe a requisição e envia uma resposta (qualquer que seja ela) em uma thread com a prioridade RealTime (as outras threads não devem usar essa prioridade).

Esse é um dos poucos casos em que é absolutamente necessário alterar a prioridade de uma thread.

Atenção! Atenção! Atenção! Essa thread deve fazer quase nada, exceto pelo fato de responder rapidamente à requisição do dispositivo. Qualquer regra de negócio, etc, deve ser feita fora dessa thread.

(Por que é que você não precisaria disso se sua thread ficasse escutando um socket ou esperando ler de um arquivo? É que nesses dois casos o Windows já eleva a prioridade da thread que está esperando ler de um socket, ou ler de um arquivo, para uma prioridade bem alta. Uma vez que o socket tenha sido lido ou o arquivo tenha sido lido, então a prioridade baixa automaticamente. Mas no caso de uma interface serial, isso não ocorre. )

L

thingol:
Se seu dispositivo requer que a resposta seja enviada em no máximo 30 ms, eu diria que é necessário deixar só essa parte que recebe a requisição e envia uma resposta (qualquer que seja ela) em uma thread com a prioridade RealTime (as outras threads não devem usar essa prioridade).

Esse é um dos poucos casos em que é absolutamente necessário alterar a prioridade de uma thread.

Atenção! Atenção! Atenção! Essa thread deve fazer quase nada, exceto pelo fato de responder rapidamente à requisição do dispositivo. Qualquer regra de negócio, etc, deve ser feita fora dessa thread.

(Por que é que você não precisaria disso se sua thread ficasse escutando um socket ou esperando ler de um arquivo? É que nesses dois casos o Windows já eleva a prioridade da thread que está esperando ler de um socket, ou ler de um arquivo, para uma prioridade bem alta. Uma vez que o socket tenha sido lido ou o arquivo tenha sido lido, então a prioridade baixa automaticamente. Mas no caso de uma interface serial, isso não ocorre. )

Nesse caso essa estratégia devo aplicar em c++ né?
Nesse caso eu também teria que cuidar da thread de recebimento de dados? pois se eu demorar muito nessa hora eu não terei tempo para escrever.

L

juliocbq:
laudenpower:
Bom, vou desfiar meu rosário… :slight_smile:
Tenho um servidor feito em vb que realiza uma consulta via serial rs485 para 5 dispositivos diferentes e com seus respectivos endereços.
Acontece que o meu objetivo é “tomar” o lugar de um desses 5 dispositivos, e para isso eu preciso emular o protocolo de comunicação dele.
A parte de emular o protocolo já foi realizada, porém o servidor realiza uma consulta de status dos dispositivos em um intervalo de 30ms entre um dispositivo e outro, e a consulta de status consiste em um pacote de 12 caracteres, onde está contido o endereço do dispositivo (para que o mesmo responda na sua vez).
Essa consulta é realizada em todos os dispositivos pelo servidor e quando acontece algo a algum dispositivo, esse deve responder assim que recebe o pacote de consulta contendo o seu endereço.
Então o dispositivo possui 30ms para realizar o envio do comando que indica a ocorrencia do evento nele (como o pressionamento de uma botoeira, por exemplo).
Nesse caso se o dispositivo demora mais de 30ms para devolver o comando referente ao evento ocorrido, o servidor acaba recebendo esse comando durante a consulta de outro dispositivo, invalidando assim o envio do dispositivo e quebrando o protocolo.

Resumindo: Preciso enviar um comando para o servidor numa faixa máxima de 30ms depois de receber o comando de consulta com o endereço do dispositivo emulado, pois se isso não acontecer o servidor passa a consultar o proximo dispositivo e o comando enviado é invalidado pelo servidor.

Tentei fazer isso em: Java, VB e delphi6 falhei miseravelmente em todos eles.

Nesse caso a forma que o C++ utiliza para manipular porta serial é a mesma do java (com rxtx), VB e delphi? (Nesse caso o C++ utiliza apenas a api do windows ou existe outra forma?).

Posso estar errado, mas não creio que o c++ vá resolver a sua situação. Todas essas opções que você usou(java, delphi, vb) usam a mesma api do windows internamente.

Nesse caso c++ utiliza a api do windows também?

J

laudenpower:
juliocbq:
laudenpower:
Bom, vou desfiar meu rosário… :slight_smile:
Tenho um servidor feito em vb que realiza uma consulta via serial rs485 para 5 dispositivos diferentes e com seus respectivos endereços.
Acontece que o meu objetivo é “tomar” o lugar de um desses 5 dispositivos, e para isso eu preciso emular o protocolo de comunicação dele.
A parte de emular o protocolo já foi realizada, porém o servidor realiza uma consulta de status dos dispositivos em um intervalo de 30ms entre um dispositivo e outro, e a consulta de status consiste em um pacote de 12 caracteres, onde está contido o endereço do dispositivo (para que o mesmo responda na sua vez).
Essa consulta é realizada em todos os dispositivos pelo servidor e quando acontece algo a algum dispositivo, esse deve responder assim que recebe o pacote de consulta contendo o seu endereço.
Então o dispositivo possui 30ms para realizar o envio do comando que indica a ocorrencia do evento nele (como o pressionamento de uma botoeira, por exemplo).
Nesse caso se o dispositivo demora mais de 30ms para devolver o comando referente ao evento ocorrido, o servidor acaba recebendo esse comando durante a consulta de outro dispositivo, invalidando assim o envio do dispositivo e quebrando o protocolo.

Resumindo: Preciso enviar um comando para o servidor numa faixa máxima de 30ms depois de receber o comando de consulta com o endereço do dispositivo emulado, pois se isso não acontecer o servidor passa a consultar o proximo dispositivo e o comando enviado é invalidado pelo servidor.

Tentei fazer isso em: Java, VB e delphi6 falhei miseravelmente em todos eles.

Nesse caso a forma que o C++ utiliza para manipular porta serial é a mesma do java (com rxtx), VB e delphi? (Nesse caso o C++ utiliza apenas a api do windows ou existe outra forma?).

Posso estar errado, mas não creio que o c++ vá resolver a sua situação. Todas essas opções que você usou(java, delphi, vb) usam a mesma api do windows internamente.

Nesse caso c++ utiliza a api do windows também?

Sim, isso mesmo. Todo procedimento usa a api do windows. Hoje não há como acessar o hardware sem passar pela vm do windows. É um procedimento de segurança que começou com o windows 2000 na época. Não há como acessar hardware nem diretamente com assembly rodando num 2k pra frente.

O que acontece é que a biblioteca do c++ é bem enxuta, o que te permite especificar bem o que você deseja fazer. Mas a mesma coisa pode ser feita em pascal ou vb. Basta usar as bibliotecas do windows.

O que te aconselho a fazer é remover os demais dispositivos e deixar apenas um para testes. Ou talvez mexer no protocolo e criar um semáforo para que quando o recurso compartilhado esteja em uso, um outro dispositivo não interfira na comunicação.

Se puder, faça um desenho para nós de como o protocolo funciona e de como é o esquema de comunicação. Aí vamos poder ter uma boa idéia do problema.

L

juliocbq manda o teu mail que eu te mando a imagem, pois não tenho lugar para fazer upload para mostrar a imagem.

L

Estava instalando o qtcreator depois da dica do julio e ao tentar compilar a api de porta serial que o mesmo indicou tenho o seguinte erro:

When executing build step 'qmake'
Could not find make command: make in the build environment

O que poderia ser?

Criado 29 de novembro de 2010
Ultima resposta 2 de dez. de 2010
Respostas 23
Participantes 6