Ir para conteúdo
Fórum Script Brasil
  • 0

Cabeçalhos C do Ruby.


.fábio

Pergunta

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

-

Backtrace dos erros nos cabeçalhos do sistema:

C:/MinGW/include/wingdi.h:1356: error: conflicting declaration 'typedef struct tagBITMAP BITMAP'

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

Editado por .fábio
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Pelo que vejo nos erros, parece ser um erro na biblioteca Allegro em conflito com o WinGDI. A Allegro parece ter uma estrutura "BITMAP" enquanto a WinGDI também possui uma.

WinGDI:

typedef struct tagBITMAP
  {
    LONG        bmType;
    LONG        bmWidth;
    LONG        bmHeight;
    LONG        bmWidthBytes;
    WORD        bmPlanes;
    WORD        bmBitsPixel;
    LPVOID      bmBits;
  } BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;

Acho que o Ruby só suportar Visual Studio no Windows seja somente uma aparência. MinGW é como se fosse um "gcc/g++" no Windows, não vejo problemas.

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0
Pelo que vejo nos erros, parece ser um erro na biblioteca Allegro em conflito com o WinGDI. A Allegro parece ter uma estrutura "BITMAP" enquanto a WinGDI também possui uma.

WinGDI:

typedef struct tagBITMAP
  {
    LONG        bmType;
    LONG        bmWidth;
    LONG        bmHeight;
    LONG        bmWidthBytes;
    WORD        bmPlanes;
    WORD        bmBitsPixel;
    LPVOID      bmBits;
  } BITMAP, *PBITMAP, NEAR *NPBITMAP, FAR *LPBITMAP;

Acho que o Ruby só suportar Visual Studio no Windows seja somente uma aparência. MinGW é como se fosse um "gcc/g++" no Windows, não vejo problemas.

Abraços.

Obrigado pela resposta! :D

Sobre o bug com WinGDI, realmente Allegro tem uma estrutura própria BITMAP. Então esta é a causa do conflito... Nem havia reparado, heh. :)

Mas como eu poderia arrumar um erro deste? Quem sabe com Namespaces?

(Aliás, é o Ruby que importa WinGDI, por isto não é um problema do código Allegro)

Sobre o bug do Ruby, vou te mostrar umas mensagens:

In file included from ruby/ruby.h:25,

from ruby.h:32,

from main.c:34:

ruby/config.h:2:2: #error MSC version unmatch: _MSC_VER: 1500 is expected.

In file included from C:/MinGW/include/process.h:18,

from ruby/win32.h:55,

from ruby/defines.h:192,

from ruby/ruby.h:70,

from ruby.h:32,

from main.c:34:

C:/MinGW/include/stdint.h:27: error: redeclaration of C++ built-in type `char'

C:/MinGW/include/stdint.h:28: error: redeclaration of C++ built-in type `char'

C:/MinGW/include/stdint.h:29: error: redeclaration of C++ built-in type `short'

C:/MinGW/include/stdint.h:30: error: redeclaration of C++ built-in type `short'

C:/MinGW/include/stdint.h:31: error: redeclaration of C++ built-in type `int'

C:/MinGW/include/stdint.h:32: error: redeclaration of C++ built-in type `unsigned'

C:/MinGW/include/stdint.h:33: error: redeclaration of C++ built-in type `long'

C:/MinGW/include/stdint.h:34: error: redeclaration of C++ built-in type `long'

In file included from ruby/ruby.h:1126,

from ruby.h:32,

from main.c:34:

ruby/intern.h:376: error: `st_data_t' has not been declared

ruby/intern.h:376: error: ISO C++ forbids declaration of `parameter' with no type

ruby/intern.h:755: error: `st_data_t' has not been declared

ruby/intern.h:755: error: ISO C++ forbids declaration of `parameter' with no type

mingw32-make.exe: *** [main.o]Error 1

Alguma reflexão sobre isto? Para mim, mais parece que está sendo compilado um código C como se fosse C++.

(Aliás, o que pensa sobre os cabeçalhos do Ruby não se "encontrarem"?)

Editado por .fábio
Link para o comentário
Compartilhar em outros sites

  • 0

O primeiro erro é por não ser MSVC mesmo. O segundo é estranho, não deveria haver problema com a stdint.h, que é uma header padrão. O terceiro não tenho certeza, mas talvez seja pelo código C estar sendo compilado como C++ mesmo. Como uma dica, tente baixar o MSVC Express (que é gratuito) e compilar.

Desculpe pela demora!

Abraços.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...