Problemas na compilação de código c++ no netbeans 6.5
23 respostas
L
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 é:
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.
É, 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).
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
yoshikichi
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 é:
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
No site do netbeans tem um tutorial de como instalar e configurar o C++ nele, em windows, linux etc…
falow
V
ViniGodoy
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
laudenpower
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
ViniGodoy
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
laudenpower
Bom, vou desfiar meu rosário…
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
ViniGodoy
E você já verificou se a lentidão é mesmo da serial? Ou da sua própria aplicação?
L
laudenpower
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
ViniGodoy
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
laudenpower
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.
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 )
V
ViniGodoy
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á:
Inicializar objetos desnecessariamente;
Fazer cópias desnecessárias de dados;
Recair em memory leaks e buffers underuns;
J
juliocbq
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 )
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
juliocbq
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
juliocbq
laudenpower:
Bom, vou desfiar meu rosário…
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
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. )
L
laudenpower
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
laudenpower
juliocbq:
laudenpower:
Bom, vou desfiar meu rosário…
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
juliocbq
laudenpower:
juliocbq:
laudenpower:
Bom, vou desfiar meu rosário…
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
laudenpower
juliocbq manda o teu mail que eu te mando a imagem, pois não tenho lugar para fazer upload para mostrar a imagem.
L
laudenpower
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