(→Problemas Gerais de Compilação) |
|||
Line 6: | Line 6: | ||
== Problemas Gerais de Compilação == | == Problemas Gerais de Compilação == | ||
+ | === Bibliotecas e Interfaces === | ||
'''Q:''' Se tiver uma biblioteca '''libteste.a''' compilada a partir de '''a.h''' e de '''b.h''' e um programa que a usa fazendo #include de '''a.h''' e de '''b.h''', não consigo compilar o programa sem ter os '''.h''' originais?<br> | '''Q:''' Se tiver uma biblioteca '''libteste.a''' compilada a partir de '''a.h''' e de '''b.h''' e um programa que a usa fazendo #include de '''a.h''' e de '''b.h''', não consigo compilar o programa sem ter os '''.h''' originais?<br> | ||
'''R:''' Se o programa cliente usa os nomes '''a.h''' e '''b.h''', então eles têm de existir (mesmo que não sejam os originais). Em geral, a interface ('''.h''') de uma biblioteca é independente do código utilizado na sua produção: podem existir '''.h''' (C/C++) para bibliotecas produzidas a partir de Fortran, por exemplo. Um exemplo concreto é a interface para o standard I/O do C: em C está acessível via '''stdio.h''' e em C++ via '''cstdio'''. | '''R:''' Se o programa cliente usa os nomes '''a.h''' e '''b.h''', então eles têm de existir (mesmo que não sejam os originais). Em geral, a interface ('''.h''') de uma biblioteca é independente do código utilizado na sua produção: podem existir '''.h''' (C/C++) para bibliotecas produzidas a partir de Fortran, por exemplo. Um exemplo concreto é a interface para o standard I/O do C: em C está acessível via '''stdio.h''' e em C++ via '''cstdio'''. | ||
+ | === Compilação e localização de "expression_type" === | ||
'''Q:''' Ao executar "make" para construir o projecto, estou a ter o seguinte erro: | '''Q:''' Ao executar "make" para construir o projecto, estou a ter o seguinte erro: | ||
/usr/include/cdk/ast/expression_node.h:47:38: fatal error: target/expression_type.h: No such file or directory | /usr/include/cdk/ast/expression_node.h:47:38: fatal error: target/expression_type.h: No such file or directory | ||
Line 18: | Line 20: | ||
(ou seja, a variável tem de ser definida sem qualquer valor) | (ou seja, a variável tem de ser definida sem qualquer valor) | ||
+ | === Compilação e "undefined referente to vtable" === | ||
'''Q:''' Estou a compilar o projecto e ocorre o erro: "undefined referente to vtable" na class basic_ast_visitor. Que se está a passar?<br/> | '''Q:''' Estou a compilar o projecto e ocorre o erro: "undefined referente to vtable" na class basic_ast_visitor. Que se está a passar?<br/> | ||
'''R:''' O erro ocorre no projecto, geralmente na hierarquia dos "visitors", devido a não terem sido definidos todos os métodos declarados nos "visitors". Note-se que não basta declará-los no cabeçalho da classe: é necessário definir os seus corpos, mesmo que sejam vazios. | '''R:''' O erro ocorre no projecto, geralmente na hierarquia dos "visitors", devido a não terem sido definidos todos os métodos declarados nos "visitors". Note-se que não basta declará-los no cabeçalho da classe: é necessário definir os seus corpos, mesmo que sejam vazios. |
AVISOS - Avaliação em Época Normal |
---|
Esclarecimento de dúvidas:
|
Requisitos para desenvolvimento, material de apoio e actualizações do enunciado (ver informação completa em Projecto de Compiladores):
|
Processo de avaliação (ver informação completa em Avaliação do Projecto):
|
Material de Uso Obrigatório |
---|
As bibliotecas CDK e RTS de apoio ao desenvolvimento do projecto são de uso obrigatório: |
|
A máquina virtual, fornecida para desenvolvimento do projecto, já contém todo o material de apoio. |
Uso Obrigatório: Repositório GIT |
Apenas se consideram para avaliação os projectos existentes no repositório GIT oficial. Apenas se considera para avaliação o ramo main.
Trabalhos não presentes no repositório no final do prazo têm classificação 0 (zero) (não são aceites outras formas de entrega). Não são admitidas justificações para atrasos em sincronizações do repositório. A indisponibilidade temporária do repositório, desde que inferior a 24 horas, não justifica atrasos na submissão de um trabalho. |
Q: Se tiver uma biblioteca libteste.a compilada a partir de a.h e de b.h e um programa que a usa fazendo #include de a.h e de b.h, não consigo compilar o programa sem ter os .h originais?
R: Se o programa cliente usa os nomes a.h e b.h, então eles têm de existir (mesmo que não sejam os originais). Em geral, a interface (.h) de uma biblioteca é independente do código utilizado na sua produção: podem existir .h (C/C++) para bibliotecas produzidas a partir de Fortran, por exemplo. Um exemplo concreto é a interface para o standard I/O do C: em C está acessível via stdio.h e em C++ via cstdio.
Q: Ao executar "make" para construir o projecto, estou a ter o seguinte erro:
/usr/include/cdk/ast/expression_node.h:47:38: fatal error: target/expression_type.h: No such file or directory compilation terminated. make: *** [zu_parser.tab.o] Error 1
Que se passa?
R: O problema ocorre devido ao valor incorrecto de uma variável no ficheiro Makefile do projecto. O valor da variável ROOT deve ser definido como se segue:
ROOT =
(ou seja, a variável tem de ser definida sem qualquer valor)
Q: Estou a compilar o projecto e ocorre o erro: "undefined referente to vtable" na class basic_ast_visitor. Que se está a passar?
R: O erro ocorre no projecto, geralmente na hierarquia dos "visitors", devido a não terem sido definidos todos os métodos declarados nos "visitors". Note-se que não basta declará-los no cabeçalho da classe: é necessário definir os seus corpos, mesmo que sejam vazios.
O nome do compilador corresponde sempre ao nome da linguagem. O processo envolve três etapas: compilação do código fonte, compilação do código gerado (pelo yasm/nasm) e ligação dos módulos binários no executável final (incluindo a librts.a).
Assumindo a distribuição do Simple na directoria actual e a directoria "examples" com os programas de teste, as seguintes acções seriam necessárias para compilar o exemplo 1 (ex1.spl):
./simple examples/ex1.spl yasm -felf examples/ex1.asm ld -o examples/ex1 examples/ex1.o -lrts
Os vários comandos podem diferir nos parâmetros exactos (dependendo do ambiente). Por exemplo, se a librts.a não estiver numa localização conhecida pelo ld, então é necessário dar o comando da seguinte forma:
ld -o examples/ex1 examples/ex1.o -L$HOME/compiladores/root/usr/lib -lrts