Olá para todos! Sou um novo membro, como pode ser visto. :)
Primeiramente, antes de alcançar o clímax do tópico, gostaria de pedir desculpas por minha primeiríssima postagem neste fórum de programadores ser uma requisição de ajuda, ao invés de algo mais útil à comunidade. :(
De qualquer modo, chamo-me Fábio Moritz de Almeida, e adoro programar, :) exceto que sempre encontro grandes obstáculos, heh. Bem, eu estudo linguagens interpretadas e compiladas, sendo a primeira as minhas preferidas, como Ruby, Lua, etc. Nas compiladas, estou estudando C++ apenas.
-
Enfim... agora permita-me ir ao assunto do tópico. :3
Meu problema é uma aparente incompatilidade "recursiva" (se me permitem usar o termo) com cabeçalhos (em C) que vêm com a implementação do código fonte da linguagem de programação interpretada Ruby (no meu caso, a versão 1.9.1p376). Obviamente, estes cabeçalhos vêm para que se possa fazer extensões em C para o Ruby (cujo era meu objetivo), mas estressantemente descobri que, ao menos para mim, não foi tão fácil quanto usar o seguinte código:
# include "ruby.h"
O que, é claro, é o óbvio a se fazer.
Vou explicar resumidamente o `backtrace' dos cabeçalhos, para o caso de que não seja possível obtê-los e checá-los (e eu também acho desnecessário colar todo o código aqui):
-> O cabeçalho `ruby.h' seta algumas macros simples, e logo depois inclui um cabeçalho `ruby/ruby.h';
* Só para evitar dúvidas: este cabeçalho inclui outro de mesmo nome, mas a pasta é diferente, assim como seu conteúdo.
-> O segundo cabeçalho `ruby.h', por sua vez, inclui um cabeçalho denomidado `ruby/config.h' e faz definições simples;
-> Neste momento, o programa não encontraria o cabeçalho requerido, porque, por algum motivo, o `make' do Ruby (para compilá-lo) o põe numa pasta bem distinta. De qualquer modo, assumo que manualmente colocamos o cabeçalho à pasta `ruby';
-> `ruby/config.h' checa a seguinte macro: `_MSC_VER', e testa se a mesma tem como valor `1500'. Se não, um erro ocorre e para o `processo';
-> Se tudo ocorrer bem, o cabeçalho acima definirá um monte de macros de configuração, mas não incluirá nenhum cabeçalho novo;
-> Voltando a `ruby/ruby.h', será incluído também cabeçalhos padrões (stdlib.h, string.h, intrinsics.h, inttypes.h, stdio.h, stddef.h, alloca.h, limits.h), e mais dois cabeçalhos do Ruby: `ruby/missing.h' e `ruby/intern.h'. Após tudo isto (e muitos `# defines'), este cabeçalho não incluirá nada a mais;
-> `ruby/missing.h' inclui `sys/time.h' (um cabeçalho do sistema?), `sys/types.h', e `stdarg.h', além de algumas definições;
-> `ruby/intern.h' inclui `stdarg.h', `varargs.h', `ruby/st.h', e define muitas funções.
Certo, este é um backtrace resumido, até porque há outros cabeçalhos que são incluídos (do Ruby). Enfim, temo que toda esta informação seja imprestável, mas ao menos acho que quer dizer alguma coisa. :P
Agora, a algumas observações:
1) Todos os cabeçalhos usam a função `extern "C"' para compatilidade com o C++, então creio que não seja nada disto;
2) O cabeçalho `ruby/ruby.h' faz todas as inclusões com o caminho para o arquivo começando com `ruby/', mas o ponto é: o cabeçalho já está na pasta `ruby/'! Podem haver exceções, mas entendo que como o cabeçalho já está à pasta, ele estaria tentando entrar em outra subpasta `ruby/', e portanto nunca encontraria os cabeçalhos que estão logo ao lado! A pergunta é: por que alguém deixaria isto intocado?
3) Como `config.h' verifica a macro _MSC_VER, isto determina que os cabeçalhos do Ruby exigem o uso do Microsoft Visual C++ como compilador, estou errado? De qualquer modo, eu tenho usado o MinGW, e para conseguir passar por esta... incompatibilidade ridícula, eu simplesmente comento as instruções que checam isto. Mas está realmente certo fazer isto? Digo, pode ser que a exigência do MSVC seja pelo fato de que apenas este compilador possa compilar algumas das instruções dadas.
4) Os cabeçalhos só têm descrição da data de criação dos mesmos, não da última atualização. Como o cabeçalho `ruby/ruby.h', por exemplo, tem como data de criação o ano de 1993, não posso me negar achar que está meio sem atualização.
5) Procurei, sem frutos, por algum comentário sobre os cabeçalhos do Ruby, mas pelo jeito este problema só acontece comigo. :(
O problema realmente acontece, primeiramente, por não encontrar os ditos cabeçalhos (por procurar à pasta errada), e vários erros de implementação. Estas informações foram tiradas das informações de erros do compilador MinGW.
[Ah, e outro curioso problema: os cabeçalhos do C++ bugam também! (Editarei este post para aprofundar esta informação.)]
C:/MinGW/include/allegro/gfx.h:289: error: 'BITMAP' has a previous declaration as `typedef struct BITMAP BITMAP'
C:/MinGW/include/wingdi.h:1356: error: declaration of `typedef struct tagBITMAP BITMAP'
C:/MinGW/include/allegro/gfx.h:289: error: conflicts with previous declaration `typedef struct BITMAP BITMAP'
C:/MinGW/include/wingdi.h:1356: error: declaration of `typedef struct tagBITMAP BITMAP'
C:/MinGW/include/allegro/gfx.h:289: error: conflicts with previous declaration `typedef struct BITMAP BITMAP'
C:/MinGW/include/wingdi.h:1356: error: declaration of `typedef struct tagBITMAP BITMAP'
C:/MinGW/include/allegro/gfx.h:289: error: conflicts with previous declaration `typedef struct BITMAP BITMAP'
Certo, desculpem dizer `sistema' como se fosse, no caso, da Microsoft, mas de qualquer modo, é do sistema do compilador MinGW.
*Nota: eu fiz a compilação através do MSVC também, para comparação, e constatei que o mesmo erro acontece (o da declaração conflitante).*
Enfim...
Desculpem o grande post misturado com minha introdução ao fórum, :) mas eu realmente estou com este problema há um bom tempo, e é algo aparentemente simples.
Agradeço antecipadamente a ajuda de todos, e aguardo respostas! :D
Pergunta
.fábio
Olá para todos! Sou um novo membro, como pode ser visto. :)
Primeiramente, antes de alcançar o clímax do tópico, gostaria de pedir desculpas por minha primeiríssima postagem neste fórum de programadores ser uma requisição de ajuda, ao invés de algo mais útil à comunidade. :(
De qualquer modo, chamo-me Fábio Moritz de Almeida, e adoro programar, :) exceto que sempre encontro grandes obstáculos, heh. Bem, eu estudo linguagens interpretadas e compiladas, sendo a primeira as minhas preferidas, como Ruby, Lua, etc. Nas compiladas, estou estudando C++ apenas.
-
Enfim... agora permita-me ir ao assunto do tópico. :3
Meu problema é uma aparente incompatilidade "recursiva" (se me permitem usar o termo) com cabeçalhos (em C) que vêm com a implementação do código fonte da linguagem de programação interpretada Ruby (no meu caso, a versão 1.9.1p376). Obviamente, estes cabeçalhos vêm para que se possa fazer extensões em C para o Ruby (cujo era meu objetivo), mas estressantemente descobri que, ao menos para mim, não foi tão fácil quanto usar o seguinte código:
O que, é claro, é o óbvio a se fazer.
Vou explicar resumidamente o `backtrace' dos cabeçalhos, para o caso de que não seja possível obtê-los e checá-los (e eu também acho desnecessário colar todo o código aqui):
-> O cabeçalho `ruby.h' seta algumas macros simples, e logo depois inclui um cabeçalho `ruby/ruby.h';
* Só para evitar dúvidas: este cabeçalho inclui outro de mesmo nome, mas a pasta é diferente, assim como seu conteúdo.
-> O segundo cabeçalho `ruby.h', por sua vez, inclui um cabeçalho denomidado `ruby/config.h' e faz definições simples;
-> Neste momento, o programa não encontraria o cabeçalho requerido, porque, por algum motivo, o `make' do Ruby (para compilá-lo) o põe numa pasta bem distinta. De qualquer modo, assumo que manualmente colocamos o cabeçalho à pasta `ruby';
-> `ruby/config.h' checa a seguinte macro: `_MSC_VER', e testa se a mesma tem como valor `1500'. Se não, um erro ocorre e para o `processo';
-> Se tudo ocorrer bem, o cabeçalho acima definirá um monte de macros de configuração, mas não incluirá nenhum cabeçalho novo;
-> Voltando a `ruby/ruby.h', será incluído também cabeçalhos padrões (stdlib.h, string.h, intrinsics.h, inttypes.h, stdio.h, stddef.h, alloca.h, limits.h), e mais dois cabeçalhos do Ruby: `ruby/missing.h' e `ruby/intern.h'. Após tudo isto (e muitos `# defines'), este cabeçalho não incluirá nada a mais;
-> `ruby/missing.h' inclui `sys/time.h' (um cabeçalho do sistema?), `sys/types.h', e `stdarg.h', além de algumas definições;
-> `ruby/intern.h' inclui `stdarg.h', `varargs.h', `ruby/st.h', e define muitas funções.
Certo, este é um backtrace resumido, até porque há outros cabeçalhos que são incluídos (do Ruby). Enfim, temo que toda esta informação seja imprestável, mas ao menos acho que quer dizer alguma coisa. :P
Agora, a algumas observações:
1) Todos os cabeçalhos usam a função `extern "C"' para compatilidade com o C++, então creio que não seja nada disto;
2) O cabeçalho `ruby/ruby.h' faz todas as inclusões com o caminho para o arquivo começando com `ruby/', mas o ponto é: o cabeçalho já está na pasta `ruby/'! Podem haver exceções, mas entendo que como o cabeçalho já está à pasta, ele estaria tentando entrar em outra subpasta `ruby/', e portanto nunca encontraria os cabeçalhos que estão logo ao lado! A pergunta é: por que alguém deixaria isto intocado?
3) Como `config.h' verifica a macro _MSC_VER, isto determina que os cabeçalhos do Ruby exigem o uso do Microsoft Visual C++ como compilador, estou errado? De qualquer modo, eu tenho usado o MinGW, e para conseguir passar por esta... incompatibilidade ridícula, eu simplesmente comento as instruções que checam isto. Mas está realmente certo fazer isto? Digo, pode ser que a exigência do MSVC seja pelo fato de que apenas este compilador possa compilar algumas das instruções dadas.
4) Os cabeçalhos só têm descrição da data de criação dos mesmos, não da última atualização. Como o cabeçalho `ruby/ruby.h', por exemplo, tem como data de criação o ano de 1993, não posso me negar achar que está meio sem atualização.
5) Procurei, sem frutos, por algum comentário sobre os cabeçalhos do Ruby, mas pelo jeito este problema só acontece comigo. :(
O problema realmente acontece, primeiramente, por não encontrar os ditos cabeçalhos (por procurar à pasta errada), e vários erros de implementação. Estas informações foram tiradas das informações de erros do compilador MinGW.
[Ah, e outro curioso problema: os cabeçalhos do C++ bugam também! (Editarei este post para aprofundar esta informação.)]
-
Backtrace dos erros nos cabeçalhos do sistema:
Certo, desculpem dizer `sistema' como se fosse, no caso, da Microsoft, mas de qualquer modo, é do sistema do compilador MinGW.
*Nota: eu fiz a compilação através do MSVC também, para comparação, e constatei que o mesmo erro acontece (o da declaração conflitante).*
Enfim...
Desculpem o grande post misturado com minha introdução ao fórum, :) mas eu realmente estou com este problema há um bom tempo, e é algo aparentemente simples.
Agradeço antecipadamente a ajuda de todos, e aguardo respostas! :D
Editado por .fábioLink para o comentário
Compartilhar em outros sites
3 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.